P1445 [Violet]櫻花 題解(推式子)
阿新 • • 發佈:2021-11-13
題目連結
題目思路
求\(1/x+1/y=1/n!\)中\((x,y)\)的對數
首先可以進行化簡成為\((x+y)n!-xy=0\)
對於這種問題肯定是想要化成質因子分解的形式的
兩邊同時加上\(n!^2\)
則化簡為\((x-n!)(y-n!)=n!^2\)
然後進行質因子分解即可
程式碼
不擺爛了,寫題#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; #define fi first #define se second #define debug printf("aaaaaaaaaaa\n"); const int maxn=1e6+5,inf=0x3f3f3f3f,mod=1e9+7,mul=233; const ll INF=0x3f3f3f3f3f3f3f3f; const double eps=1e-7; int n; int prime[maxn],cnt; int isprime[maxn]; ll tot[maxn]; void getprime(int n){ for(ll i=2;i<=n;i++){//開ll因為後面要計算i*prime[j] if(!isprime[i]){ prime[++cnt]=i; isprime[i]=i; } for(int j=1;j<=cnt&&i*prime[j]<=n;j++){ isprime[i*prime[j]]=prime[j]; if(i%prime[j]==0) break; } } } int main(){ getprime(1000000); scanf("%d",&n); for(int i=1;i<=n;i++){ int now=i; while(now!=1){ tot[isprime[now]]+=2; now/=isprime[now]; } } ll ans=1; for(int i=1;i<=n;i++){ ans=ans*(tot[i]+1)%mod; } printf("%lld\n",ans); return 0; }