51nod1355 斐波那契的最小公倍数
直接粘我前几天交流的课件了QAQ
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define debug cout 6 typedef long long int lli; 7 using namespace std; 8 const int maxn=1e6+1e2,lim=1e6; 9 const int mod=1e9+7; 10 11 lli f[maxn],g[maxn]; 12 bool vis[maxn]; 13 14 inline lli fastpow(lli base,int tim) { 15 lli ret = 1; 16 while(tim) { 17 if( tim & 1 ) ret = ret * base % mod; 18 if( tim >>= 1 ) base = base * base % mod; 19 } 20 return ret; 21 } 22 23 inline void sieve() { 24 static int prime[maxn],cnt; 25 static bool vis[maxn]; 26 g[1] = f[1] = 1; 27 for(int i=2;i<=lim;i++) { 28 g[i] = f[i] = ( f[i-1] + f[i-2] ) % mod; 29 if( !vis[i] ) prime[++cnt] = i; 30 for(int j=1;j<=cnt&&(lli)i*prime[j]<=lim;j++) { 31 vis[i*prime[j]] = 1; 32 if( ! ( i % prime[j] ) ) break; 33 } 34 } 35 for(int i=1;i<=lim;i++) { 36 lli inv = fastpow(g[i],mod-2); 37 for(int j=i+i;j<=lim;j+=i) g[j] = g[j] * inv % mod; 38 } 39 } 40 inline lli calc() { 41 lli ret = 1; 42 for(int i=1;i<=lim;i++) { 43 bool used = 0; 44 for(int j=i;j<=lim;j+=i) used |= vis[j]; 45 if( used ) ret = ret * g[i] % mod; 46 } 47 return ret; 48 } 49 50 int main() { 51 static int n,t; 52 scanf("%d",&n) , sieve(); 53 while(n--) scanf("%d",&t) , vis[t] = 1; 54 printf("%lld\n",calc()); 55 return 0; 56 }
甘く優しい物語の中で
在这甜蜜又温柔的故事中
いつか悲しい終わりがくる
悲伤的结局终有一日会来临
閉じた世界にさよなら言うよ
向这封锁的世界道声再见吧
涙を拭いて 足跡ふたつ
拭去泪花 两道足迹
煌いた未来へ
向闪耀的未来延绵