結果
問題 | No.8038 フィボナッチ数列の周期 |
ユーザー |
![]() |
提出日時 | 2018-04-02 13:28:17 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 90 ms / 3,000 ms |
コード長 | 3,256 bytes |
コンパイル時間 | 1,037 ms |
コンパイル使用メモリ | 94,212 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-26 06:34:51 |
合計ジャッジ時間 | 2,726 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 25 |
コンパイルメッセージ
main.cpp: In function ‘ll get_period(ll)’: main.cpp:116:1: warning: control reaches end of non-void function [-Wreturn-type] 116 | } | ^
ソースコード
#include <iostream>#include <vector>#include <string>#include <cmath>#include <algorithm>#include <utility>#include <queue>#include <set>#include <map>using namespace std;typedef long long ll;typedef pair<int,int> PII;typedef vector<int> VI;typedef vector<VI> VVI;#define MP make_pair#define PB push_back#define inf 1000000007#define rep(i,n) for(int i=0;i<(int)(n);++i)template<typename A, size_t N, typename T>void Fill(A (&array)[N], const T &val){std::fill( (T*)array, (T*)(array+N), val );}long long mod = 1000000007;long long calc(long long k,long long m){if(m==0)return 1;if(m==1)return k%mod;long long s = calc(k,m/2);if(m%2==0){return (s*s)%mod;}else{long long ans;ans = (s*s)%mod;return (k*ans)%mod;}}vector<ll> prime;#define N 100000bool arr[N];void Eratosthenes(){for(int i = 0; i < N; i++){arr[i] = 1;}for(int i = 2; i < N; i++){if(arr[i]){prime.push_back((ll)i);for(int j = 0; i * (j + 2) < N; j++){arr[i *(j + 2)] = 0;}}}}vector<vector<ll> > mult(vector<vector<ll> >&u,vector<vector<ll> >&v,ll p){vector<vector<ll> >z(2,vector<ll>(2));z[0][0] = (u[0][0]*v[0][0]+u[0][1]*v[1][0])%p;z[0][1] = (u[0][0]*v[0][1]+u[0][1]*v[1][1])%p;z[1][0] = (u[1][0]*v[0][0]+u[1][1]*v[1][0])%p;z[1][1] = (u[1][0]*v[0][1]+u[1][1]*v[1][1])%p;return z;}vector<vector<ll> > mul(ll x,ll p){vector<vector<ll> > A(2,vector<ll>(2));A[0][0]=0;A[0][1]=1;A[1][0]=1;A[1][1]=1;if(x==1){return A;}if(x%2==0){vector<vector<ll> > z;z = mul(x/2,p);return mult(z,z,p);}else{vector<vector<ll> > z;z = mul(x/2,p);z = mult(z,z,p);return mult(z,A,p);}}ll get_period(ll p){if(p==2)return 3;if(p==5)return 20;set<ll> d;if(p%10==1||p%10==9){ll x = p-1;for(ll i=1;i<=sqrt(x)+1;i++){if(x%i==0){if(i%2==0)d.insert(i);if((x/i)%2==0)d.insert(x/i);}}}else{ll x = 2*p+2;d.insert(x);for(ll i=1;i<=sqrt(x);i++){if(x%i==0){if((p+1)%i!=0)d.insert(i);if((p+1)%(x/i)!=0)d.insert(x/i);}}}for(auto x:d){vector<vector<ll> > A(2,vector<ll>(2));A = mul(x,p);if(A[0][0]==1&&A[0][1]==0&&A[1][0]==0&&A[1][1]==1){return x;}}}int main(){int n;cin >> n;Eratosthenes();map<ll,ll> ans;for(int i=0;i<n;i++){ll p,k;cin >> p >> k;ll z = get_period(p);map<ll,ll>tmp;tmp[p]+=k-1;for(int i=0;i<prime.size();i++){if(prime[i]*prime[i]>z)break;while(1){if(z%prime[i]!=0)break;z/=prime[i];tmp[prime[i]]++;}}if(z!=1){tmp[z]++;}for(auto x:tmp){ans[x.first] = max(ans[x.first],x.second);}}ll s=1;for(auto x:ans){ll t = calc(x.first,x.second);s = (s*t)%mod;}cout << s << endl;return 0;}