[luogu4626][一道水題2]
阿新 • • 發佈:2018-10-31
題目連結
思路
這個首先想到質因數分解。然後發現只要對於每個質數將ans乘以這個質數在從1到n中出現過的最高指數次就行了。
這個\(10^8\)令人髮指。一直tle,最後發現吸口氧才能過。。
程式碼
#include<cstdio> #include<iostream> #include<bitset> #define fi(s) freopen(s,"r",stdin); #define fo(s) freopen(s,"w",stdout); using namespace std; typedef long long ll; const int N = 100000000 + 100,mod = 100000007; bitset<N>vis; int dis[N/15]; ll read() { ll x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } return x * f; } int js; int n; ll work(int x) { ll ans = 1,k = n; k /= x; while(k) { k /= x; ans = ans * x % mod; } return ans; } int main() { n = read(); for(int i = 2;i <= n;++i) { if(!vis[i]) dis[++js] = i; for(int j = 1;j <= js && dis[j] * i <= n;++j) { vis[dis[j] * i] = 1; if(i % dis[j] == 0) break; } } ll ans = 1; for(int i = 1;i <= js;++i) ans = ans * work(dis[i]) % mod; cout<<ans; return 0; }