ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

poj2917

2021-11-13 10:35:58  阅读:150  来源: 互联网

标签:prime cnt frac rep ans lxl poj2917


要求

\[\frac{1}{x} +\frac{1}{y} = \frac{1}{n} \\ \]

x,y,n都是正整数,且x<=y的(x,y)解数

\[\begin{align} \frac{1}{x} +\frac{1}{y} &= \frac{1}{n} \\ n(x+y) &=xy \\ \end{align} \]

显然x,y均大于n
设 x=n+a,y=n+b

\[n^2=ab \]

所以答案就是(a,b)的对数

设P为n的约数个数,因为x<=y,所以答案为(p+1)/1
若p为偶数,则答案为p/2,否则为(p+1)/2,所以就是(p+1)/2
n<=1e9,但是n最大质因子<=1e5
那么根据算术基本定理,n^2的可以从n来计算

int v[100007], prime[100007], cnt;
inline void Euler_Sieve(int mx) {
	rep(i, 2, mx) {
		if(!v[i]) {
			v[i] = i;
			prime[++cnt] = i;
		}
		rep(j, 1, cnt) {
			if(prime[j] > v[i] || 1ll * prime[j]*i > mx) break;
			v[i * prime[j]] = prime[j];
		}
	}
}
inline lxl calc(lxl n) {
	lxl ans(1);
	rep(i, 1, cnt) {
		lxl c(0);
		while(n % prime[i]==0) {
			n /= prime[i];
			++c;
		}
		ans *= (2 * c + 1);
	}
	if(n > 1) ans = (ans << 1) + ans;
	return ans;
}

int main() {
	lxl T,n;
	cin>>T;
	Euler_Sieve(100000);
	rep(p, 1, T) {
		cin>>n;
		lxl res = calc(n);
		printf("Scenario #%d:\n%lld\n\n", p, (res + 1) / 2);
	}
	return 0;
}

标签:prime,cnt,frac,rep,ans,lxl,poj2917
来源: https://www.cnblogs.com/QQ2519/p/15547376.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有