【ybt高效进阶6-2-3】不定方程(数学)

不定方程

题目链接:ybt高效进阶6-2-3

题目大意

给你 n,问你 1/x+1/y=1/n! 这个不定方程有多少个正整数解。

思路

看到这个就开始化式子:
1 / x + 1 / y = 1 / n ! 1/x+1/y=1/n! 1/x+1/y=1/n!
x n ! + y n ! = x y xn!+yn!=xy xn!+yn!=xy
y ( x − n ! ) = x n ! y(x-n!)=xn! y(xn!)=xn!
y = x n ! / ( x − n ! ) y=xn!/(x-n!) y=xn!/(xn!)

然后发现分母不太好搞的样子,直接用值代替。
t = x − n ! t=x-n! t=xn!
x = n ! + t x=n!+t x=n!+t
y = ( n ! + t ) n ! / t y=(n!+t)n!/t y=(n!+t)n!/t
y = ( n ! ) 2 / t + n ! y=(n!)^2/t+n! y=(n!)2/t+n!

然后你分析一下就会发现,你就是要 t t t ( n ! ) 2 (n!)^2 (n!)2 的因子。
那就把 n ! n! n! 质因数分解,答案就是 ∏ ( 2 × c i + 1 ) \prod(2\times c_i+1) (2×ci+1)。(要乘二是因为平方这个质数的个数翻倍了)

代码

#include<cstdio>
#define ll long long
#define mo 1000000007

using namespace std;

int n, prime[1000001];
ll ans;
bool np[1000001];

void get_prime(int n) {
	for (int i = 2; i <= n; i++) {
		if (!np[i]) prime[++prime[0]] = i;
		for (int j = 1; j <= prime[0] && 1ll * i * prime[j] <= n; j++) {
			np[i * prime[j]] = 1;
			if (i % prime[j] == 0) break;
		}
	}
}

int main() {
	scanf("%d", &n);
	
	get_prime(n);
	
	ans = 1;
	for (int i = 1; i <= prime[0]; i++) {
		ll num = 0;
		for (ll j = prime[i]; j <= n; j *= prime[i]) {
			num = (num + n / j) % mo;
		}
		ans = (ans * (2 * num + 1)) % mo;
	}
	
	printf("%lld", ans);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值