ABC C - Factors of Factorial
N!の約数の個数を数える問題。
の数字を片っ端から素数で割っていく。
は添字に素数を持ち、N!の素因数の数を持つ。
の値を初めて更新するとき()は、が含まれるからにしてる。
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<stack> #include<queue> #include<vector> #include<cmath> #include<utility> #include<set> #include<complex> #include<map> #define vi vector<int> #define vvi vector<vector<int> > #define ll long long int #define vl vector<ll> #define vvl vector<vector<ll>> #define vb vector<bool> #define vc vector<char> #define vs vector<string> #define ld long double #define INF 1e9 #define EPS 0.0000000001 #define rep(i,n) for(int i=0;i<n;i++) #define loop(i,s,n) for(int i=s;i<n;i++) #define all(in) in.begin(), in.end() #define MAX 1e4 #define MOD 1000000007 using namespace std; typedef pair<int, int> pii; typedef pair<double,double>pdd; typedef pair<ll,ll>pll; vi inde(MAX,0); ll cal(int num, int div){ int ans=1; while(true){ if(num%div==0){num/=div; ans++;} else break; } if(!inde[div])inde[div]+=ans; else inde[div]+=ans-1; return 0; } int main(){ vector<bool>Primecheck(MAX+1,true); vector<int>Primenumber(MAX+1,0); int Primecounter =0; for(int i = 2; i<MAX+1;i++){ if(Primecheck[i]){ for(int j = 2;i*j<MAX;j++) Primecheck[i*j] = false; Primenumber[Primecounter] = i; Primecounter++; } } ll num; cin>>num; ll ans=1; for(int n=(int)num; n>1; n--){ for(int i=0; i<Primecounter;i++){ if(Primenumber[i]>n)break; if(n%Primenumber[i]==0){cal(n,Primenumber[i]);} } } for(int i=0; i<num+1; i++){ if(inde[i]){ans*=inde[i]; ans%=MOD;} } cout<<ans<<endl; }