櫻花--acwing(求n!的約數個數&階乘的質因分解&求約數公式)
阿新 • • 發佈:2020-12-29
題目:https://www.acwing.com/activity/content/11/可能需要報名課程才能做。
給定一個整數 nn,求有多少正整數數對 (x,y)(x,y) 滿足 1/x+1/y=1/n!。
輸入格式:
一個整數 n。
輸出格式:
一個整數,表示滿足條件的數對數量。
答案對 109+7取模。
資料範圍
1≤n≤106
題意:將這個公式化簡最後可以化簡為:y=n!+(n!)平方/(x-n!)
題解:求階乘的質數分解,然後(c12+1)×(c22+1)—就是答案
求某個數的約數個數公式:
推理公式過程:
程式碼:
#include <iostream> #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+9; const int mod=1e9+7; int n; int vis[N]; int prime[N]; int cnt; void init(int n) //線性篩模板 { cnt=0; vis[0]=vis[1]=1; for(int i=2; i<=n; i++) { if(vis[i]==0)prime[cnt++]=i; for(int j=0; prime[j]*i<=n; j++) { vis[i*prime[j]]=1; if(i%prime[j]==0)break; } } } int main() { scanf("%d",&n); init(n); ll sum=1; for(int i=0; i<cnt; i++) //階乘質因分解模板 { int ant=0; int p=prime[i]; for(int j=1; pow(p,j)<=n; j++) //找到每個質數可以在n範圍內構成的數的個數 { //因為某個數可能有同一個質數的次方構成,所以列舉次方 ant+=n/pow(p,j);//找到在n範圍內,可以構成的數的個數 } sum=sum*(ant*2+1)%mod;//利用合數個數公式求答案,這裡就算ant為也沒事兒 } //因為有個+1相當於×本身 printf("%lld\n",sum); return 0; }