洛谷P3327:[SDOI2015]约数个数和 (莫比乌斯反演)
来源:互联网 发布:深圳程序员工资2016 编辑:程序博客网 时间:2024/05/19 13:10
题目传送门:https://www.luogu.org/problem/show?pid=3327
题目分析:这题我又没有自己想出来……
主要是本题要用到一个很神的结论:
这个是怎么推出来的呢?
我们考虑质数p对d(ij)的贡献,假设i的质因数分解中有k个p,j的质因数分解中q个p,那么d(ij)中就会有因数k+q+1,而:
这就相当于一个(k+1)*(q+1)的矩形,只取了左下角的”L”字型的一块。
现在我们假设
现在我们记
是不是很神奇?
现在回到原题,经上面变形,我们要求:
我们将x,y的枚举拉到i,j的前面,得到:
我们用莫比乌斯函数将中括号内的东西替代掉,得到:
将k的枚举拉到前面:
我们设
我们可以用
CODE:
#include<iostream>#include<string>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=50005;typedef long long LL;int sum[maxn];bool vis[maxn];int prime[maxn];int cur=0;LL g[maxn];int t,n,m;LL ans;void Preparation(){ for (int i=1; i<maxn; i++) { g[i]=0; int last; for (int j=1; j<=i; j=last+1) { last=i/(i/j); g[i]=g[i]+(long long)( i/j*(last-j+1) ); } } sum[1]=1; for (int i=2; i<maxn; i++) { if (!vis[i]) sum[i]=-1,prime[++cur]=i; for (int j=1; j<=cur && i*prime[j]<maxn; j++) { int k=i*prime[j]; vis[k]=true; if (i%prime[j]) sum[k]=-sum[i]; else { sum[k]=0; break; } } } for (int i=2; i<maxn; i++) sum[i]+=sum[i-1];}int main(){ freopen("c.in","r",stdin); freopen("c.out","w",stdout); Preparation(); scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); if (n>m) swap(n,m); ans=0; int last; for (int i=1; i<=n; i=last+1) { last=min( n/(n/i) , m/(m/i) ); ans=ans+( (long long)(sum[last]-sum[i-1])*g[n/i]*g[m/i] ); } cout<<ans<<endl; } return 0;}
阅读全文
1 0
- 洛谷P3327:[SDOI2015]约数个数和 (莫比乌斯反演)
- 洛谷 P3327 [SDOI2015]约数个数和 (莫比乌斯反演)
- Sdoi2015约数个数和题解莫比乌斯反演
- 【bzoj3994】[SDOI2015]约数个数和 莫比乌斯反演
- 3994: [SDOI2015]约数个数和 莫比乌斯反演
- [莫比乌斯反演 约数个数] BZOJ 3994 [SDOI2015]约数个数和
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- 【BZOJ3994】【SDOI2015】约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- [BZOJ3994][SDOI2015]约数个数和(莫比乌斯反演)
- BZOJ 3994 Sdoi2015 约数个数和 莫比乌斯反演
- BZOJ 3994 [SDOI2015]约数个数和 (神定理+莫比乌斯反演)
- BZOJ 3994: [SDOI2015]约数个数和|莫比乌斯反演
- BZOJ_P3994 [SDOI2015]约数个数和(数论+莫比乌斯反演)
- 【bzoj3994】[SDOI2015]约数个数和 线性筛法+莫比乌斯反演+数论分块
- BZOJ 3994 [SDOI2015]约数个数和 (莫比乌斯反演)
- BZOJ 3994: [SDOI2015]约数个数和 莫比乌斯反演
- BZOJ 3994 [SDOI2015]约数个数和 莫比乌斯反演
- Java多线程
- Kotlin在Android上令人惊叹的技巧
- 引起进程创建的事件有哪些?
- NYOJ 一笔画问题
- wxPython:实现俄罗斯方块
- 洛谷P3327:[SDOI2015]约数个数和 (莫比乌斯反演)
- nginx实现负载均衡
- TensorFlow实现MLP(多层感知机)
- 1004 Anagrams by Stack
- JaveScript之关于时间的函数
- CNN文本分类
- 决策树
- Length of Last Word
- C++广度优先搜索算法之走出迷宫