【BZOJ3994】【SDOI2015】约数个数和(莫比乌斯反演)
2018-02-03 10:41
387 查看
Description
给定nn,mm,求∑i=1n∑j=1md(i×j)∑i=1n∑j=1md(i×j)其中d(x)d(x)表示xx的约数个数。
Solution
一个结论:Conclusion:d(nm)=∑i|n∑j|m[gcd(i,j)=1]d(nm)=∑i|n∑j|m[gcd(i,j)=1]
Proof: n=px11px22…n=p1x1p2x2…,m=py11py22…m=p1y1p2y2…,i=pa11pa22…i=p1a1p2a2…,j=pb11pb22…j=p1b1p2b2…
∵gcd(i,j)=1∵gcd(i,j)=1
∴aibi=0∴aibi=0
ai,biai,bi一共有(xi+yi+1)(xi+yi+1)中取值
则总数为∏xi+yi+1∏xi+yi+1
即nmnm的约数和
有了这个结论,就可以开始推式子了:
n∑i=1m∑j=1d(ij)∑i=1n∑j=1md(ij)
=n∑i=1m∑j=1∑x|i∑y|j[gcd(x,y)=1]=∑i=1n∑j=1m∑x|i∑y|j[gcd(x,y)=1]
=n∑i=1m∑j=1⌊ni⌋⌊mj⌋[gcd(i,j)=1]=∑i=1n∑j=1m⌊ni⌋⌊mj⌋[gcd(i,j)=1]
设f(x)=n∑i=1m∑j=1⌊ni⌋⌊mj⌋[gcd(i,j)=x]f(x)=∑i=1n∑j=1m⌊ni⌋⌊mj⌋[gcd(i,j)=x]
F(x)=n∑i=1m∑j=1⌊ni⌋⌊mj⌋[x|gcd(i,j)]=⌊nx⌋∑i=1⌊mx⌋∑j=1⌊nxi⌋⌊mxj⌋F(x)=∑i=1n∑j=1m⌊ni⌋⌊mj⌋[x|gcd(i,j)]=∑i=1⌊nx⌋∑j=1⌊mx⌋⌊nxi⌋⌊mxj⌋
则答案为:f(1)=min{n,m}∑x=1μ(x)⌊nx⌋∑i=1⌊mx⌋∑j=1⌊nxi⌋⌊mxj⌋=min{n,m}∑x=1μ(x)⌊nx⌋∑i=1⌊⌊ni⌋x⌋⌊mx⌋∑j=1⌊⌊mj⌋x⌋f(1)=∑x=1min{n,m}μ(x)∑i=1⌊nx⌋∑j=1⌊mx⌋⌊nxi⌋⌊mxj⌋=∑x=1min{n,m}μ(x)∑i=1⌊nx⌋⌊⌊ni⌋x⌋∑j=1⌊mx⌋⌊⌊mj⌋x⌋
设g(n)=∑ni=1⌊ni⌋g(n)=∑i=1n⌊ni⌋
则f(1)=min{n,m}∑x=1μ(x)g(⌊nx⌋)g(⌊mx⌋)f(1)=∑x=1min{n,m}μ(x)g(⌊nx⌋)g(⌊mx⌋)
对g(i)g(i)预处理或者要求的时候再算然后存下来。
对μ(i)μ(i)线性筛出来然后求前缀和。
最后算的时候整除分块即可。
调了一上午,一直RE,把cout改成printf就A掉了??
Source
/************************************** * Au: Hany01 * Date: Feb 2nd, 2018 * Prob: BZOJ3994 & SDOI2015 约数个数和 * Email: hany01@foxmail.com **************************************/ #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; #define rep(i, j) for (register int i = 0, i##_end_ = (j); i < i##_end_; ++ i) #define For(i, j, k) for (register int i = (j), i##_end_ = (k); i <= i##_end_; ++ i) #define Fordown(i, j, k) for (register int i = (j), i##_end_ = (k); i >= i##_end_; -- i) #define Set(a, b) memset(a, b, sizeof(a)) #define Cpy(a, b) memcpy(a, b, sizeof(a)) #define fir first #define sec second #define pb(a) push_back(a) #define mp(a, b) make_pair(a, b) #define ALL(a) (a).begin(), (a).end() #define SZ(a) ((int)(a).size()) #define INF (0x3f3f3f3f) #define INF1 (2139062143) #define Mod (1000000007) #define debug(...) fprintf(stderr, __VA_ARGS__) template <typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; } template <typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; } inline int read() { register int _, __; register char c_; for (_ = 0, __ = 1, c_ = getchar(); c_ < '0' || c_ > '9'; c_ = getchar()) if (c_ == '-') __ = -1; for ( ; c_ >= '0' && c_ <= '9'; c_ = getchar()) _ = (_ << 1) + (_ << 3) + (c_ ^ 48); return _ * __; } inline void File() { #ifdef hany01 freopen("bzoj3994.in", "r", stdin); freopen("bzoj3994.out", "w", stdout); #endif } const int maxn = 50010; int n, m, mu[maxn], Sum_mu[maxn], pr[maxn >> 1], cnt, np[maxn]; LL Ans, g[maxn]; inline void Get_mu(int n) { mu[1] = 1; for (register int i = 2; i <= n; ++ i) { if (!np[i]) pr[++ cnt] = i, mu[i] = -1; for (register int j = 1; j <= cnt && i * pr[j] <= n; ++ j) { np[i * pr[j]] = 1; if (i % pr[j]) mu[i * pr[j]] = -mu[i]; else { mu[i * pr[j]] = 0; break; } } } For(i, 1, n) Sum_mu[i] = Sum_mu[i - 1] + mu[i]; } inline LL Get_g(int n) { if (g ) return g ; for (register int l = 1, r = 1; l <= n; l = r + 1) r = n / (n / l), g += (LL)n / l * (LL)(r - l + 1); return g ; } inline void Solve() { for (register int T = read(); T --; ) { n = read(), m = read(), Ans = 0; if (n > m) swap(n, m); for (register int l = 1, r; l <= n; l = r + 1) r = min(n / (n / l), m / (m / l)), Ans += Get_g(n / l) * Get_g(m / l) * (LL)(Sum_mu[r] - Sum_mu[l - 1]); printf("%lld\n", Ans); } } int main() { File(); Get_mu(maxn - 10); Solve(); return 0; }
相关文章推荐
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- 【BZOJ 3994】3994: [SDOI2015]约数个数和(莫比乌斯反演)
- 【BZOJ3994】【SDOI2015】约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- [bzoj 3994] sdoi2015 约数个数和
- BZOJ 3994 [SDOI2015]约数个数和
- BZOJ3994[SDOI2015] 约数个数和
- bzoj3994 [SDOI2015]约数个数和
- 【bzoj3994】[SDOI2015]约数个数和
- bzoj3994 [SDOI2015]约数个数和
- 【BZOJ3994】【SDOI2015】约数个数和
- BZOJ3994: [SDOI2015]约数个数和
- BZOJ3994 [SDOI2015]约数个数和
- bzoj3994[SDOI2015]约数个数和
- BZOJ 3994: [SDOI2015]约数个数和
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- BZOJ 3994 [SDOI2015]约数个数和
- bzoj 3994: [SDOI2015]约数个数和
- BZOJ 3994 [SDOI2015]约数个数和 (神定理+莫比乌斯反演)