NC21335. 倍集
描述
输入描述
输入一行包含四个整数A,B,C,D
1 ≤ A ≤ 1010
A ≤ B ≤ 1010
B + 1 ≤ C ≤ 1010
C ≤ D ≤ 1010
输出描述
输出一个整数
示例1
输入:
1 1 2 2
输出:
1
示例2
输入:
1 2 3 4
输出:
2
示例3
输入:
2 3 5 7
输出:
3
示例4
输入:
1 10 100 1000
输出:
500
示例5
输入:
1000000000 2000000000 9000000000 10000000000
输出:
1254365078
pypy3(pypy3.6.1) 解法, 执行用时: 72ms, 内存消耗: 20184K, 提交时间: 2020-09-22 22:55:30
a,b,c,d=map(int,input().split()) a=max(a,b//2+1) c=max(c,d//2+1) left=a ans=int(d-c+1) try: while left<=d: k=int(d//left) right=int(min(b,(c-1)//k)) if right>=left: ans+=int(right-left+1) left=int(d//k+1) #每次k减1 else: print(int(ans)) except: pass
C++11(clang++ 3.9) 解法, 执行用时: 13ms, 内存消耗: 628K, 提交时间: 2020-04-12 21:39:18
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main(){ ll a,b,c,d; cin>>a>>b>>c>>d; a=max(a,b/2+1); c=max(c,d/2+1); ll ans=d-c+1; for(ll k,r;a<=d;a=d/k+1){ k=d/a; r=min((c-1)/k,b); if(r>=a)ans+=r-a+1; } cout<<ans<<endl; }
C 解法, 执行用时: 4ms, 内存消耗: 436K, 提交时间: 2022-10-16 16:32:45
#include<stdio.h> int main() { long long A,B,C,D,sum=0,r,x,l,k; scanf("%lld%lld%lld%lld",&A,&B,&C,&D); A=A>B/2+1?A:B/2+1; C=C>D/2+1?C:D/2+1; sum=D-C+1; C--; for(l=A;l<D;l=D/k+1){ k=D/l; x=C/k; r=B<x?B:x; if(r>=l)sum+=r-l+1; if(x>=B)break; } printf("%lld\n",sum); return 0; }
Python3 解法, 执行用时: 129ms, 内存消耗: 6984K, 提交时间: 2021-07-19 07:49:55
a,b,c,d=map(int,input().split()) a=max(a,b//2+1) c=max(c,d//2+1)#注意内置函数的应用 left=a ans=d-c+1 while left<=b: k=d//left right=min(b,(c-1)//k)#c//k if right>=left: ans+=right-left+1 left=d//k+1 else:#自然结束该循环执行的语句。 print(ans)