提出 #1521092
ソースコード 拡げる
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct LinearRec{
int n;
const int LOG=31,P=1000000007;
vector<int> first,trans;
vector<vector<int> > bin;
vector<int> Add(vector<int> &a, vector<int> &b){
vector<int> result(n*2+1,0);
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++){
if((result[i+j]+=1LL*a[i]*b[j]%P)>=P)result[i+j]-=P;
}
}
for(int i=2*n;i>n;i--){
for(int j=0;j<n;j++){
if((result[i-1-j]+=1LL*result[i]*trans[j]%P)>=P)result[i-1-j]-=P;
}result[i]=0;
}
result.erase(result.begin()+n+1,result.end());
return result;
}
LinearRec(vector<int> &first,vector<int> &trans):first(first),trans(trans){
n=first.size();
vector<int> a(n+1,0);
a[1]=1;
bin.push_back(a);
for(int i=1;i<LOG;i++)bin.push_back(Add(bin[i-1],bin[i-1]));
}
int Calc(int k){
vector<int> a(n+1,0);
a[0]=1;
for(int i=0;i<LOG;i++){if(k>>i&1)a=Add(a,bin[i]);}
int ret=0;
for(int i=0;i<n;i++){
if((ret+=1LL*a[i+1]*first[i]%P)>=P)ret-=P;
}return ret;
}
};
int main(){
int n,k;
scanf("%d%d",&n,&k);
vector<int> a(n,1);
LinearRec Rec(a,a);
printf("%d\n",Rec.Calc(k));
return 0;
}
提出情報
提出日時
2017-08-20 14:48:59+0900
問題
T - フィボナッチ
ユーザ
forever97
言語
C++14 (GCC 5.4.1)
得点
8
コード長
1389 Byte
結果
AC
実行時間
1341 ms
メモリ
512 KiB
コンパイルエラー
./Main.cpp: In function ‘int main()’:
./Main.cpp:44:24: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d",&n,&k);
^
ジャッジ結果
セット名
All
得点 / 配点
8 / 8
結果
セット名
テストケース
All
00, 01, 02, 03, 04, 90, 91
ケース名
結果
実行時間
メモリ
00
AC
1251 ms
512 KiB
01
AC
819 ms
512 KiB
02
AC
1341 ms
512 KiB
03
AC
223 ms
384 KiB
04
AC
971 ms
512 KiB
90
AC
1 ms
256 KiB
91
AC
1 ms
256 KiB