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
",calc());
55     return 0;
56 }
View Code

甘く優しい物語の中で
在这甜蜜又温柔的故事中
いつか悲しい終わりがくる
悲伤的结局终有一日会来临
閉じた世界にさよなら言うよ
向这封锁的世界道声再见吧
涙を拭いて 足跡ふたつ
拭去泪花 两道足迹
煌いた未来へ
向闪耀的未来延绵

原文地址:https://www.cnblogs.com/Cmd2001/p/9068906.html