poj 2917 Diophantus of Alexandria 因数分解解1/x+1/y=1/n

题意:

给定n,求丢番图方程1/x+1/y=1/n(x<=y)的解数。

分析:

设x=n+a,y=n+b,化简可得n^2=a*b.设n^2的因子个数为p,n^2的所有因子中除n外都是成队出现的,故方程解数为(p+1)/2。

代码:

//poj 2917
//sep9
#include <iostream>
using namespace std;
int num[64];

int main()
{
	int cases,t=0;
	scanf("%d",&cases);
	while(cases--){
		int n,p=0;
		memset(num,0,sizeof(num));
		scanf("%d",&n);
		for(int i=2;i*i<=n;++i){
			if(n%i==0){
				while(n%i==0){
					++num[p];
					n/=i;
				}
				++p;
			}
		}
		if(n!=1){
			++num[p];
			++p;
		}
		for(int i=0;i<p;++i)
			num[i]*=2;
		int ans=1;
		for(int i=0;i<p;++i)
			ans*=(num[i]+1);
		printf("Scenario #%d:\n%d\n\n",++t,(ans+1)/2);
	}
} 
时间: 2025-01-07 23:11:28

poj 2917 Diophantus of Alexandria 因数分解解1/x+1/y=1/n的相关文章

hdu 1299 Diophantus of Alexandria(数学题)

题目链接:hdu 1299 Diophantus of Alexandria 题意: 给你一个n,让你找1/x+1/y=1/n的方案数. 题解: 对于这种数学题,一般都变变形,找找规律,通过打表我们可以发现这个答案只与这个数的因子有关. n=a1^p1*a2^p2*...*an^pn ans=((1+2*p1)*(1+2*p2)*...*(1+2*pn)+1)/2 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;

hdu 1299 Diophantus of Alexandria (数论)

Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2269    Accepted Submission(s): 851 Problem Description Diophantus of Alexandria was an egypt mathematician living in Ale

【POJ 1845】 Sumdiv (整数唯分+约数和公式+二分等比数列前n项和+同余)

[POJ 1845] Sumdiv 用的东西挺全 最主要通过这个题学了约数和公式跟二分求等比数列前n项和 另一种小优化的整数拆分  整数的唯一分解定理: 随意正整数都有且仅仅有一种方式写出其素因子的乘积表达式. A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)   当中pi均为素数 约数和公式: 对于已经分解的整数A=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn) 有A的全部因子之和为 S = (1+p1+p1^2+p1^3+...p1^k1

hdu-1299 Diophantus of Alexandria(分解素因子)

思路: 因为x,y必须要大与n,那么将y设为(n+k);那么根据等式可求的x=(n2)/k+n;因为y为整数所以k要整除n*n; 那么符合上面等式的x,y的个数就变为求能被n*n整除的数k的个数,且k>=n; 那么k就在n到n*n之间,不过这样不则么好求. 因为x,y具有对称性,从y=(n+k)和x=(n2)/k+n;也可以看出(n*n/k,和k等价因为k*(n*n/k)=n*n): 由于任何数都可以拆成素数的乘积,形式为a1^x1*a2^x2*a3*^x3......; 那么因数的个数为(1+

hdu 1299 Diophantus of Alexandria

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299 题目大意:就是给你一个n,求1/x+//y=1/n正整数解的个数. 思路:首先我们可以在两边同时乘以xyn得yn+xn=xy,然后因式分解的(x-n)*(y-n)=n*n.这题要求解的个数,就变成了求n*n的因子数,网上很多人都是令y=n+k,然后的x=(n*n)/k+n,这儿也是求n*n的因子数. 通过数论的中的学习我们知道任意一个数n都可以由素数表示出来,即: n=p1^e1*p2^e2*

hdoj-1299-Diophantus of Alexandria【判断素因子个数+组合数】

Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2853 Accepted Submission(s): 1099 Problem Description Diophantus of Alexandria was an egypt mathematician living in Alexand

POJ 3034 Whac-a-Mole(DP)

题目链接 题意 : 在一个二维直角坐标系中,有n×n个洞,每个洞的坐标为(x,y), 0 ≤ x, y < n,给你一把锤子可以打到地鼠,最开始的时候,你可以把锤子放在任何地方,如果你上一秒在(x1,y1),那下一秒直线移动到的整数点(x2,y2)与这个点的距离小于等于d,并且当锤子移动(x2,y2)这个点时,所有在两点的直线上的整点数都可以打到.例如(0,0)移动到(0,3).如果(0,1),(0,2)有老鼠出现就会被打到.求能够打的最多老鼠. 思路 : Dp[i][j][k]代表点(i,j)

后缀数组 POJ 3261 Milk Patterns

题目链接 题意:可重叠的 k 次最长重复子串.给定一个字符串,求至少出现 k 次的最长重复子串,这 k 个子串可以重叠. 分析:与POJ 1743做法类似,先二分答案,height数组分段后统计 LCP>=m 的子串的个数. #include <cstdio> #include <cstring> #include <algorithm> const int N = 2e4 + 5; int sa[N], rank[N], height[N]; int t[N],

POJ 2142-The Balance(扩展欧几里德)

题目地址:POJ 2142 题意:有两种类型的砝码质量分别为a和b,要求称出质量为d的物品,要求a的数量x和b的数量y的和x+y最小,若有多个x+y的值,取ax+by最小的. 思路:我们应该求ax+by=d.这里我们应用扩展欧几里德求出ax+by=gcd(a,b),那么ax/gcd(a,b)+by/gcd(a,b)=1,然后求出来特解,令x=x*n,把x转化为最小正值,即x=(x%b+b)%b,求出此时的y=(d-ax)/b,若求出的y是负值,把y变成正的,因为砝码的位置涉及左右之分.同理求出y