【莫比乌斯反演】[BZOJ 2820 YY的GCD]
2015-07-01 21:00
405 查看
从黄学长那盗来的图
可以线筛预处理F,或者暴力枚举质数(这个复杂度我不能确定),按照素数粗略个数n/logn以及调和级数求和nlogn来看暴力的复杂度接近On
处理完F以后就是喜闻乐见的下底函数分块
可以线筛预处理F,或者暴力枚举质数(这个复杂度我不能确定),按照素数粗略个数n/logn以及调和级数求和nlogn来看暴力的复杂度接近On
处理完F以后就是喜闻乐见的下底函数分块
[code]#include<cstdio> #include<cstring> #define maxl 10000001 int n,m; int no[maxl],p[maxl],mu[maxl]; long long sum[maxl]; long long ans; void shai() { no[1]=1;mu[1]=1; for(int i=2;i<maxl;i++) { if(!no[i]) p[++p[0]]=i,mu[i]=-1; int j=1,t=p[1]*i; while(j<=p[0] && t<maxl) { no[t]=1; if(i%p[j]==0) { mu[t]=0; break; } mu[t]=-mu[i]; t=i*p[++j]; } } for(int i=1;i<=p[0];i++) { int num=p[i]; for(int j=1;j*num<maxl;j++) sum[j*num]+=mu[j]; } for(int i=1;i<maxl;i++) sum[i]+=sum[i-1]; } void prework() { scanf("%d%d",&n,&m); if(n>m) { int t=n; n=m; m=t; } } int min(int x,int y) { if(x<y) return x; else return y; } void mainwork() { int pos=0; ans=0; for(int i=1;i<=n;i=pos+1) { pos=min((n/(n/i)),(m/(m/i))); ans+=(sum[pos]-sum[i-1])*(n/i)*(m/i); } } void print() { printf("%lld\n",ans); } int main() { int t; shai(); scanf("%d",&t); while(t--) { prework(); mainwork(); print(); } return 0; }
相关文章推荐
- CentOS系统中替换或修改yum源的方法
- NSString 中包含中文字符时转换为NSURL
- 解决显示隐藏层中select标签中的option在IE浏览器鼠标移上去就整个DIV都隐藏
- 如何更改Java括号中的默认对齐
- 用java实现大文件分割、排序、合并
- 16进制转10进制
- LinkedList
- [Angularjs]ng-select和ng-options
- 学习笔记_Java_day13_JSP三大指令()
- Arrays.asList()
- 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
- 面向服务的体系架构(SOA)——负载均衡
- Python图像处理(13):brisk特征检测
- 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
- 自定义UIView整理(1)
- delphi 资源文件详解
- Oracle 如何删除1000w条数据?
- Android手机安装原版BT5[ARM]
- c++面试题之求整数n范围内的全部质数最佳算法
- OC基础3:一些基本概念