bzoj3994: [SDOI2015]约数个数和 莫比乌斯反演
2018-01-22 17:26
447 查看
bzoj3994: [SDOI2015]约数个数和
Description
设d(x)为x的约数个数,给定N、M,求 ∑iN∑jMd(ij)Input
输入文件包含多组测试数据。第一行,一个整数T,表示测试数据的组数。
接下来的T行,每行两个整数N、M。
Output
T行,每行一个整数,表示你所求的答案。Sample Input
27 4
5 6
Sample Output
110121
HINT
1<=N, M<=500001<=T<=50000
分析
结论:d(nm)=∑i|n∑j|m[gcd(i,j)=1]结论看不出来,证明还是可以水一下的
证明看这里:PoPoQQQ大爷的题解
于是
ans=∑iN∑jM∑u|i∑v|j[gcd(u,v)=1]
=∑iN∑jM⌊Ni⌋⌊Mj⌋[gcd(i,j)=1]
=∑iN∑jM⌊Ni⌋⌊Mj⌋∑d|n⋀d|nμ(d)
令i=id,j=jd
=∑dNd∑i⌊Nd⌋⌊Nid⌋∑j⌊Md⌋⌊Mjd⌋
此时,我们令f(n)=∑in⌊ni⌋
则
ans=∑dNd⋅f(⌊Nd⌋)⋅f(⌊Md⌋)
对于f(n)我们分块预处理,复杂度O(nn−√)对于ans,我们再分块,复杂度O(Tn−√)
代码
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<cmath> using namespace std; const int N = 50000; int read() { char ch = getchar();int x = 0, f = 1; while(ch < '0' || ch > '9') {if(ch == '-') f = -1; ch = getchar();} while(ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();} return x * f; } int mu[N + 10], p[N + 10], tot, n, m; long long f[N + 10]; bool vis[N + 10]; void mobius() { mu[1] = 1; for(int i = 2; i <= N; ++i) { if(!vis[i]) {mu[i] = -1; p[++tot] = i;} for(int j = 1;j <= tot && i * p[j] <= N; ++j) { vis[i * p[j]] = true; if(i % p[j]) mu[i * p[j]] = -mu[i]; else break; } } for(int i = 1;i <= N; ++i) mu[i] += mu[i - 1]; } long long get_f(int n) { long long ret = 0; for(int i = 1, pos; i <= n; i = pos + 1) { pos = n / (n / i); ret += (n / i) * (pos - i + 1); } return ret; } int main() { mobius(); for(int i = 1;i <= N; ++i) f[i] = get_f(i); int T = read(); while(T--) { n = read(); m = read(); if(n > m) swap(n, m); long long ans = 0; for(int i = 1, pos;i <= n; i = pos + 1) { pos = min(n / (n / i), m / (m / i)); ans += f[n / i] * f[m / i] * (mu[pos] - mu[i - 1]); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- BZOJ 3994 [SDOI2015]约数个数和 (神定理+莫比乌斯反演)
- BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)
- BZOJ 3994: [SDOI2015]约数个数和|莫比乌斯反演
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- [BZOJ]3994 [SDOI2015]约数个数和 莫比乌斯 + 分块
- 【BZOJ3994】[SDOI2015]约数个数和 莫比乌斯反演
- 【bzoj3994】【SDOI2015】约数个数和【数论】【反演】
- bzoj 3994: [SDOI2015]约数个数和 莫比乌斯反演
- 【BZOJ3994】【SDOI2015】约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- BZOJ 3994: [SDOI2015]约数个数和 莫比乌斯反演
- BZOJ 3994 [SDOI2015]约数个数和 莫比乌斯反演
- BZOJ 3994 Sdoi2015 约数个数和 莫比乌斯反演
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
- BZOJ 3994: [SDOI2015]约数个数和 [莫比乌斯反演 转化]
- [SDOI2015][bzoj3994] 约数个数和 [莫比乌斯反演]
- BZOJ3994:[SDOI2015]约数个数和——题解
- [bzoj3994][SDOI2015]约数个数和-数论
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)