题意:给你正整数n和k,然后计算从i到n k%i的和;
思路;如果n小于1000000,直接暴力计算,然后大于1000000的情况,然后在讨论n和k的大小,根据k%i的情况,你会发现规律,是多个等差数列,然后你把这些等差数列加上就是答案。
1 #include2 #include 3 #include 4 #define ll long long 5 using namespace std; 6 7 ll n,k; 8 ll Getsum(ll n) 9 {10 ll sum=0;11 for(ll i=1; i<=n; i++)12 {13 sum+=k%i;14 }15 return sum;16 }17 18 int main()19 {20 while(scanf("%lld%lld",&n,&k)!=EOF)21 {22 if(n<=1000000)23 {24 printf("%lld\n",Getsum(n));25 continue;26 }27 ll ans=0;28 ans+=max((ll)0,n-k)*k;29 for(int i=2; i<=10000; i++)30 {31 if(i>k) break;32 ll x1=k/(i-1)-k/i;33 if(k/i>n)continue;34 int s=k%(k/(i-1)),e=k%(k/i+1);35 if(k/(i-1)>n)36 { s=k%n;37 x1=n-k/i;38 }39 ans+=(s+e)*x1/2;40 }41 if(k>10000)42 {43 ll m=k/10000;44 ans+=Getsum(m);45 }46 printf("%lld\n",ans);47 }48 return 0;49 }