51nod 1189 階乘分數(數論)

1/N! = 1/X + 1/Y(0<x<=y),給出N,求滿足條件的整數解的數量。例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4。由於數量可能很大,輸出Mod 10^9 + 7。
輸入
輸入一個數N(1 <= N <= 1000000)。
輸出
輸出解的數量Mod 10^9 + 7。
輸入樣例
2
輸出樣例
2

1/N! = 1/X + 1/Y
=> 1/N! = (X+Y)/XY
=> XY = N!(X+Y)
=> (X-N!)(Y-N!) = (N!)^2
A*B = (N!)^2

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2000005;
typedef long long ll;
const int mod = 1e9 + 7;
int prime[maxn];
int isprime[maxn];
int cnt = 0;

ll base = 500000004;
void getPrime(int n) {
	isprime[1] = 1;
	for (int i = 2; i <= n; i++) {
		if (!isprime[i]) {
			prime[++cnt] = i;
		}
		for (int j = 1; j <= cnt && i * prime[j] <= n; j++) {
			isprime[i * prime[j]] = 1;
			if (i % prime[j] == 0) {
				break;
			}
		}
	}
}

ll getCount(int x, int n) {
	ll ans = 0;
	while (n) {
		ans += n / x;
		n /= x;
	}
	return ans;
}

int main() {
	int n;
	cin >> n;
	getPrime(n);
	ll ans = 1;
	for (int i = 1; i <= cnt; i++) {
		ll x = getCount(prime[i], n) * 2% mod;
		ans = ans * (x + 1)% mod;
	}
	cout << (ans + 1) * base % mod<< endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章