bzoj:3994:vijos1949: [SDOI2015]约数个数和
2015-12-29 14:30
399 查看
Description
设d(x)为x的约数个数,给定N、M,求Input
输入文件包含多组测试数据。第一行,一个整数T,表示测试数据的组数。
接下来的T行,每行两个整数N、M。
Output
T行,每行一个整数,表示你所求的答案。Sample Input
27 4
5 6
Sample Output
110121
HINT
1<=N, M<=500001<=T<=50000
数论……终于还是的在神犇博客的帮助下才写得出……T_T……
最后推出一个式子ans=sigma(miu(i)*f(n/i)*f(m/i)),其中f(m/i)为d数组的前缀和……还有个优化是把n/i卡成数段再加起来……
#include<cstdio> #include<algorithm> using namespace std; int t,n,m,p[10001],u[50001],s[50001],f[50001],num=0,o,an[22],xn,xm; long long ans; bool bo[50001]; char ch; inline int min(int x,int y){return x<y?x:y;} inline int read(){ o=0;ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') o=o*10+ch-48, ch=getchar(); return o; } int main(){ scanf("%d",&t); u[1]=1;s[1]=1; register int i,j; for (i=2;i<=50000;i++){ if (!bo[i]) p[num++]=i,u[i]=-1,s[i]=2,f[i]=1; for (j=0;j<num;j++){ o=i*p[j]; if (o>50000) break; bo[o]=1; if (i%p[j]) u[o]=-u[i],s[o]=s[i]*2,f[o]=1;else{ u[o]=0; s[o]=s[i]/(f[i]+1)*(f[i]+2); f[o]=f[i]+1; } } s[i]+=s[i-1];u[i]+=u[i-1]; } while(t--){ n=read();m=read(); if (n>m) swap(n,m); ans=0; for (i=1;i<=n;i=j+1) xn=n/i,xm=m/i,j=min(n/xn,m/xm),ans+=((long long)((u[j]-u[i-1])*s[xn])*s[xm]); printf("%lld\n",ans); } }
相关文章推荐
- mysql中复制表数据
- ECMAScript5 Object的新属性方法
- MyBatis简介与配置MyBatis+Spring+MySql[转]
- Python基础:11.2_函数调用
- 安全认证和授权方式:嵌入式Jetty+Jersey
- 我的问题
- Java爬虫实战(一):抓取一个网站上的全部链接 推荐
- 【bzoj1552】[Cerc2007]robotic sort splay
- linux环境变量
- Linux 基础: 挂载镜像文件(Mount & ISO)
- CoreData使用基础教程
- ios 打包
- 前端网址收集!Amazing! 神奇!
- 脚本添加删除nginx配置中的内容
- 淘宝装修之模块之间有间隙(淘宝装修一)
- Spring 官网下载zip jar
- (第一行代码笔记)调试Android程序
- Spring 官网下载zip jar
- Spring 官网下载zip jar
- 设计模式之三重定义——重载,重写,重构