hdu 1129 Diophantus of Alexandria
2016-04-17 15:05
465 查看
Problem Description
Diophantus of Alexandria was an egypt mathematician living in Alexandria. He was one of the first mathematicians to study equations where variables were restricted to integral values. In honor of him, these equations are commonly called diophantine equations. One of the most famous diophantine equation is x^n + y^n = z^n. Fermat suggested that for n > 2, there are no solutions with positive integral values for x, y and z. A proof of this theorem (called Fermat’s last theorem) was found only recently by Andrew Wiles.
Consider the following diophantine equation:
1 / x + 1 / y = 1 / n where x, y, n ∈ N+ (1)
Diophantus is interested in the following question: for a given n, how many distinct solutions (i. e., solutions satisfying x ≤ y) does equation (1) have? For example, for n = 4, there are exactly three distinct solutions:
1 / 5 + 1 / 20 = 1 / 4
1 / 6 + 1 / 12 = 1 / 4
1 / 8 + 1 / 8 = 1 / 4
Clearly, enumerating these solutions can become tedious for bigger values of n. Can you help Diophantus compute the number of distinct solutions for big values of n quickly?
Input
The first line contains the number of scenarios. Each scenario consists of one line containing a single number n (1 ≤ n ≤ 10^9).
Output
The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Next, print a single line with the number of distinct solutions of equation (1) for the given value of n. Terminate each scenario with a blank line.
Sample Input
2
4
1260
Sample Output
Scenario #1:
3
Scenario #2:
113
分析:题意就是给定n,求 x/1+y/1=n/1 满足个数。这应该是第2次做这类的题了,这种题解题思路都比较巧妙!由于已知条件少,一般会根据概侓,唯一分解定理等数论知识求出。像这题的话就是:y=k+n 代入 得 x=n^2/k+n,从而转换成求n*n的约数个数,求出x的个数。自己的原解题思路是错了。
补充:N=(p1^a1)(p2^a2)(p3^a3)…(pm^am)
约数个数:(a1+1)(a2+1)(a3+1)…(am+1)
N*N 约数就为:(a1*2+1)(a2*2+1)(a3*2+1)…(am*2+1).
Diophantus of Alexandria was an egypt mathematician living in Alexandria. He was one of the first mathematicians to study equations where variables were restricted to integral values. In honor of him, these equations are commonly called diophantine equations. One of the most famous diophantine equation is x^n + y^n = z^n. Fermat suggested that for n > 2, there are no solutions with positive integral values for x, y and z. A proof of this theorem (called Fermat’s last theorem) was found only recently by Andrew Wiles.
Consider the following diophantine equation:
1 / x + 1 / y = 1 / n where x, y, n ∈ N+ (1)
Diophantus is interested in the following question: for a given n, how many distinct solutions (i. e., solutions satisfying x ≤ y) does equation (1) have? For example, for n = 4, there are exactly three distinct solutions:
1 / 5 + 1 / 20 = 1 / 4
1 / 6 + 1 / 12 = 1 / 4
1 / 8 + 1 / 8 = 1 / 4
Clearly, enumerating these solutions can become tedious for bigger values of n. Can you help Diophantus compute the number of distinct solutions for big values of n quickly?
Input
The first line contains the number of scenarios. Each scenario consists of one line containing a single number n (1 ≤ n ≤ 10^9).
Output
The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Next, print a single line with the number of distinct solutions of equation (1) for the given value of n. Terminate each scenario with a blank line.
Sample Input
2
4
1260
Sample Output
Scenario #1:
3
Scenario #2:
113
分析:题意就是给定n,求 x/1+y/1=n/1 满足个数。这应该是第2次做这类的题了,这种题解题思路都比较巧妙!由于已知条件少,一般会根据概侓,唯一分解定理等数论知识求出。像这题的话就是:y=k+n 代入 得 x=n^2/k+n,从而转换成求n*n的约数个数,求出x的个数。自己的原解题思路是错了。
补充:N=(p1^a1)(p2^a2)(p3^a3)…(pm^am)
约数个数:(a1+1)(a2+1)(a3+1)…(am+1)
N*N 约数就为:(a1*2+1)(a2*2+1)(a3*2+1)…(am*2+1).
#include<iostream> #include<cstring> #include<algorithm> #include<string> #include<cmath> #include<queue> #include<set> #include<stack> using namespace std; const int maxn=50000; bool vis[100000]; int p[100000],num[100000]; int cnt,len=0; void is_prime()//素数打表 { for(int i=2;i<maxn;i++) { if(!vis[i]) { p[len++]=i; for(int j=i+i;j<maxn;j+=i) { vis[j]=1; } } } } void Dec(int x)//唯一分解定理求因子幂 { memset(num,0,sizeof(num)); cnt = 0; for(int i=0; p[i]*p[i]<=x&&i<len;i++) { if(x%p[i] == 0) { while(x%p[i] == 0) { num[cnt]++; x /= p[i]; } cnt++; } } if(x > 1) { num[cnt++] = 1; } } int main() { int t,n,sum; is_prime(); cin>>t; for(int i=1;i<=t;i++) { sum=1; cin>>n; cout<<"Scenario #"<<i<<":"<<endl; Dec(n); for(int j=0;j<cnt;j++) { sum*=(num[j]*2+1); } cout<<sum/2+1<<endl; cout<<endl; } return 0; }
相关文章推荐
- Xshell 无法连接虚拟机中的ubuntu的问题
- Linux--线程的控制与分离
- linux内存源码分析 - 内存回收(匿名页反向映射)
- qemu模拟Cortex-A57运行Linux4.5.1
- 在Linux下信号量的semop操作的sembu结构体中sem_flag的设置值的含义
- linux shell基本命令
- linux及安全《Linux内核设计与实现》第四章——20135227黄晓妍
- Linux内核分析第四章 读书笔记
- 【1】Docker---Windows系统上安装Boot2Docker以及安装的一些问题
- 【Chromium中文文档】沙箱FAQ
- Hadoop HDFS 的 -mkdir 不支持级联创建目录
- OpenCV学习笔记(16)双目测距与三维重建的OpenCV实现问题集锦(一)图像获取与单目定标
- 如何让网站在百度有LOGO展示
- 几个常用的Linux监控脚本
- HDFS shell 中-du -df 用法详解
- Linux内核分析--理解进程调度时机、跟踪分析进程调度和进程切换的过程
- Nginx配置文件nginx.conf具体解释
- Hadoop学习笔记(3)-搭建Hadoop伪分布式
- 关于邮箱前端架构的一些思考
- “Linux内核分析”实验报告8