給出正整數n和k,計算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的餘數。例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29c++
輸入格式:app
兩個整數n kasync
輸出格式:spa
答案.net
30%: n,k <= 1000blog
60%: n,k <= 10^6get
100% n,k <= 10^9博客
詳細題解見這個博客,it
自愧弗如io
https://blog.csdn.net/nuclearsubmarines/article/details/78165951
#include <bits/stdc++.h> using namespace std; #define ll long long int main() { ll n,k; scanf("%lld%lld",&n,&k); ll ans=n*k; for (ll i = 1,r; i <=n ; i=r+1) { if(k/i!=0) r=min((k/(k/i)),n); //k>i 在必定區間內k/i的值是相同的 在此處計算出這一塊的右區間 [i,r] 左閉右閉 else r=n; // 否者就全是0 ans-=(r-i+1)*(k/i)*(i+r)/2; //塊大小*塊內的值*i/2 } printf("%lld\n",ans); return 0; }