結果
問題 | No.658 テトラナッチ数列 Hard |
ユーザー |
![]() |
提出日時 | 2018-03-02 22:29:59 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 121 ms / 2,000 ms |
コード長 | 1,554 bytes |
コンパイル時間 | 1,494 ms |
コンパイル使用メモリ | 170,756 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-13 03:39:13 |
合計ジャッジ時間 | 2,683 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 8 |
ソースコード
#include<bits/stdc++.h>using namespace std;using Int = long long;template<typename T>struct Kitamasa{using VT = vector<T>;VT a,c;vector<VT > rs;Int m,base;using F = function<T(T,T)>;F pl,ml;T d0,d1;Kitamasa(VT& A,VT &C,F pl,F ml,T d0,T d1):a(A),c(C),rs(1),m(c.size()),base(1),pl(pl),ml(ml),d0(d0),d1(d1){a.insert(a.begin(),d0);rs[0].assign(2*m+1,d0);rs[0][1]=d1;}void form(VT &x){for(Int i=2*m;i>m;i--){for(Int j=1;j<m+1;j++)x[i-j]=pl(x[i-j],ml(c[m-j],x[i]));x[i]=d0;}}void add(VT x,VT y,VT &z){z.assign(2*m+1,d0);for(Int i=1;i<m+1;i++)for(Int j=1;j<m+1;j++)z[i+j]=pl(z[i+j],ml(x[i],y[j]));form(z);}void ensure_base(Int nbase){if(nbase<=base) return;rs.resize(nbase);for(Int i=base;i<nbase;i++)add(rs[i-1],rs[i-1],rs[i]);base=nbase;}T calc(long long n){n--;VT tmp,res(rs[0]);for(Int i=0;n;i++,n>>=1){ensure_base(i+1);if(~n&1) continue;swap(tmp,res);add(tmp,rs[i],res);}T ans=d0;for(Int i=1;i<m+1;i++) ans=pl(ans,ml(res[i],a[i]));return ans;}};//INSERT ABOVE HEREsigned main(){Int n=4;const Int MOD = 17;vector<Int> a(n,0),c(n,1);a[n-1]=1;Kitamasa<Int>::F pl=[](Int a,Int b){return (a+b)%MOD;};Kitamasa<Int>::F ml=[](Int a,Int b){return (a*b)%MOD;};Kitamasa<Int> fib(a,c,pl,ml,0,1);Int q;cin>>q;for(Int i=0;i<q;i++){Int p;cin>>p;cout<<fib.calc(p)<<endl;}return 0;}