【HDU】 1299 Diophantus of Alexandria
2016-05-28 10:57
357 查看
Diophantus of Alexandria
题目链接
Diophantus of Alexandria题目大意
给定一个整数n,现在然你求有多少组x,y满足如下等式1x+1y=1n (x≤y)
题解
我们看到最小的y和最大的x同为2n,考虑到构造y=n+k,这样我们求出x=n2k+n又因为x小于y,所以我们可以求出k≥n,x若要是整数,k必须是n^2的一个因子,所以问题转化为求n^2大于等于n的因子有多少个,实际上就是n^2的因子数+1再÷2关于这个问题,我们可以先求n的因子数,再算出n^2的因子数。于是我们先把n质因数分解为
n=pe11pe22pe33.....penn
于是
n2=p2e11p2e22p2e33.....p2enn
所以n2的因子数为
(1+2e1)(1+2e2)(1+2e3).....(1+2en)
结果加一再除2即可。
代码
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <cmath> using namespace std; int T,n,tab[100005],vis[100005],h; void dealtab(int high) { h=0; memset(tab,0,sizeof(tab)); memset(vis,0,sizeof(vis)); for (int i=2;i<=high;i++) if (!vis[i]) { int j=i; tab[h++]=i; while(j<=high) { vis[j]=1; j+=i; } } } int main() { int Case=1; scanf("%d",&T); dealtab(100000); while(T--) { int cnt=0,ans=1; scanf("%d",&n); for (int i=0;i<h;i++) { if (n==1) break; cnt=0; while (n%tab[i]==0) { cnt++; n=n/tab[i]; } ans*=(1+2*cnt); } if (n>3) ans*=3; printf("Scenario #%d:\n",Case++); printf("%d\n\n",(ans+1)/2); } return 0; }
相关文章推荐
- Ubuntu14.04下搭建LAMP架构(PHP&&Python)
- 远程CentOS 7服务器
- Java千百问_07JVM架构(010)_什么是老生代的标记算法
- 常用的OpenCV函数速查
- docker学习笔记3-使用docker镜像、容器运行过程
- 设置Tomcat的UTF-8编码
- Linux常用Shell命令
- Ubuntu下搭建samba服务器
- Citrix xendesktop中未注册(Not registered)的检查流程
- linux下查看串口
- linux内核移植到开发板步骤
- 制作openstack使用的Ubuntu镜像
- arXiv网站
- Java千百问_07JVM架构(009)_什么是新生代的复制算法
- windows和linux下Tomcat内存的分配与溢出的配置详解
- 开发板用NFS挂接linux PC的步骤
- Linux acpi off报告ACPI bug处理方法
- Linux 技巧:让进程在后台可靠运行的几种方法
- Linux acpi off关于Suspend to Disk 问题分析
- IT人士必去的10个网站