传送们:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1189
思路:通常这种题目具有轮换对称式性,化简这个式子得(X-N!)*(Y-N!) = (N!)^2, 所以我们只需要对(N!)^2求约数即可
代码:
#include <bits/stdc++.h>
using namespace std;
#define ll __int64
#define mod 1000000007
const int MP=1e3+5;
const int MN=1e6+5;
int p[MP],rear, n;
bool vis[MP];
int cnt[MN];
void GetPrime(){
for(int i=2; i<MP; i++){
if(!vis[i]){
p[++rear]=i;
for(int j=2*i; j<MP; j+=i)vis[j]=1;
}
}
}
void func(int x){
for(int i=1; i<=rear && 1LL*p[i]*p[i]<=x && x!=1 ; i++){
while(x%p[i]==0){
cnt[p[i]]++;
x/=p[i];
}
}
if(x!=1)cnt[x]++;
}
ll pow_mod(ll x, ll n){
ll ret=1;
while(n){
if(n&1)ret=ret*x%mod;
x=x*x%mod;
n>>=1;
}
return ret;
}
int main(){
GetPrime();
scanf("%d", &n);
for(int i=1; i<=n; i++)func(i);
ll ans=1;
for(int i=2; i<MN; i++)(ans*=(2*cnt[i]+1))%=mod;
ans=(ans+1)*pow_mod(2, mod-2)%mod;
printf("%lld\n", ans);
return 0;
}
描述:
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。
Input
输入一个数N(1 <= N <= 1000000)。
Output
输出解的数量Mod 10^9 + 7。
Input示例
2
Output示例
2
李陶冶
(题目提供者)