本文共 1424 字,大约阅读时间需要 4 分钟。
题目链接:
题意很简单就不说了。
因为n % x = n - n / x * x
所以答案就等于 n * m - (n/1*1 + n/2*2 ... n/m*m)
在根号n复杂度枚举x,注意一点当m>n时,后面一段加起来就等于0,就不用再枚举了。
中间一段x1 ~ x2 的n/x可能相等,所以相等的一段等差数列求和。
1 //#pragma comment(linker, "/STACK:102400000, 102400000") 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 using namespace std;14 typedef __int64 LL;15 typedef pair P;16 const int N = 1e5 + 5;17 vector myset; //存储x18 LL mod = 1e9 + 7;19 20 int main()21 {22 LL n, m;23 scanf("%lld %lld", &n, &m);24 LL k = min(m, n);25 myset.push_back(k);26 for(LL i = 1; i*i <= n; ++i) {27 myset.push_back(i);28 if(i * i != n) {29 myset.push_back(n/i);30 }31 }32 sort(myset.begin(), myset.end());33 LL ans = (n%mod)*(m%mod)%mod, cnt = 0;34 for(LL i = 0; i < myset.size() && myset[i] <= k; ++i) {35 LL temp = myset[i];36 if(cnt) {37 LL num;38 if((temp - cnt) % 2)39 num = ((temp + cnt + 1) / 2 % mod) * ((temp - cnt) % mod) % mod;40 else41 num = ((temp - cnt) / 2 % mod) * ((temp + cnt + 1) % mod) % mod;42 num = ((n / temp) % mod * num) % mod;43 ans = ((ans - num) % mod + mod) % mod;44 }45 else {46 ans = (ans - n) % mod;47 }48 cnt = temp;49 }50 printf("%lld\n", (ans + mod) % mod);51 return 0;52 }
转载于:https://www.cnblogs.com/Recoder/p/5757753.html