BZOJ 2820 莫比乌斯反演
来源:互联网 发布:软件激活码拿码平台 编辑:程序博客网 时间:2024/06/04 12:27
题目链接(权限题)
题意:给定
思路:关注此题很久了,今天借了高爷的账号终于补掉了此题(再次表示感谢qwq)
我们试着来推导一下公式。
设:
易得:
又因为
得:
此时我们可以枚举质数
但这么做还是会T的,我们可以考虑进一步优化。
令
此时我们转换一个思路,可不可以直接枚举
故答案可写成:
此时后面的约数莫比乌斯函数之和可以用预处理前缀和去维护。
这样我们就能在
但预处理时枚举素数需要
故总复杂度:
此处还有一个小优化:可以在线性筛时同时处理约数莫比乌斯函数之和。可减少常数。
代码:
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;const int A = 1e7 + 10;int pri[A],mu[A],tot,sum[A];bool vis[A];void init(){ tot = 0; mu[1] = vis[1] = vis[0] = 1; for(int i=2 ;i<A ;i++){ if(!vis[i]){pri[++tot] = i;mu[i] = -1;} for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){ vis[i*pri[j]] = 1; if(i%pri[j] == 0){ mu[i*pri[j]] = 0; break; } mu[i*pri[j]] = -mu[i]; } } for(int i=1 ;i<=tot ;i++){ for(int j=1 ;j*pri[i]<A ;j++){ sum[j*pri[i]] += mu[j]; } } for(int i=1 ;i<A ;i++) sum[i] += sum[i-1];}int main(){ init(); int T; scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); int last; ll ans = 0; for(int i=1 ;i<=min(n,m) ;i=last+1){ last = min(n/(n/i),m/(m/i)); ans += 1LL*(n/i)*(m/i)*(sum[last]-sum[i-1]); } printf("%lld\n",ans); } return 0;}
(优化)
#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;const int A = 1e7 + 10;int pri[A],mu[A],tot,sum[A];bool vis[A];void init(){ tot = 0; mu[1] = vis[1] = vis[0] = 1; for(int i=2 ;i<A ;i++){ if(!vis[i]){pri[++tot] = i;mu[i] = -1;sum[i]=1;} for(int j=1 ;j<=tot&&i*pri[j]<A ;j++){ vis[i*pri[j]] = 1; if(i%pri[j] == 0){ mu[i*pri[j]] = 0; sum[i*pri[j]] = mu[i]; break; } mu[i*pri[j]] = -mu[i]; sum[i*pri[j]] = mu[i] - sum[i]; } } for(int i=1 ;i<A ;i++) sum[i] += sum[i-1];}int main(){ init(); int T; scanf("%d",&T); while(T--){ int n,m; scanf("%d%d",&n,&m); int last; ll ans = 0; for(int i=1 ;i<=min(n,m) ;i=last+1){ last = min(n/(n/i),m/(m/i)); ans += 1LL*(n/i)*(m/i)*(sum[last]-sum[i-1]); } printf("%lld\n",ans); } return 0;}
阅读全文
2 0
- bzoj 2820 莫比乌斯反演
- bzoj 2820 莫比乌斯反演
- BZOJ 2820 莫比乌斯反演
- bzoj 2820 莫比乌斯反演
- bzoj 2301 莫比乌斯反演
- bzoj 2301 莫比乌斯反演
- BZOJ 2818(莫比乌斯反演)
- BZOJ 3309 莫比乌斯反演
- BZOJ 3994 莫比乌斯反演
- BZOJ 2005 莫比乌斯反演
- BZOJ 2301 莫比乌斯反演
- BZOJ 2820 YY的GCD 莫比乌斯反演
- 【莫比乌斯反演】[BZOJ 2820 YY的GCD]
- BZOJ 2820 YY的GCD 莫比乌斯反演
- [莫比乌斯反演] BZOJ 2820 YY的GCD
- BZOJ 2820 YY的GCD(莫比乌斯反演)
- bzoj 2820: YY的GCD 莫比乌斯反演
- BZOJ 2820 YY的GCD 莫比乌斯反演
- 编辑距离
- Weex使用(1)
- Hdu 1421 搬寝室
- java基础之ConcurrentHashMap
- Java根据ip地址获取详细地域信息
- BZOJ 2820 莫比乌斯反演
- 8 招让你优化MySQL 查询性能
- 4. 化平淡为神奇的BeautifulSoup
- 列表---快乐工作室
- JBPM工作流原理
- shell命令--tar
- Hadoop读取文件的方法,及其错误解决
- 本地连mysql报错 1045
- SpringMVC札集(04)——SpringMVC传递参数