Submission #1521092
Source Code Expand
#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;
}
Submission Info
Submission Time
2017-08-20 14:48:59+0900
Task
T - フィボナッチ
User
forever97
Language
C++14 (GCC 5.4.1)
Score
8
Code Size
1389 Byte
Status
AC
Exec Time
1341 ms
Memory
512 KiB
Compile Error
./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);
^
Judge Result
Set Name
All
Score / Max Score
8 / 8
Status
Set Name
Test Cases
All
00, 01, 02, 03, 04, 90, 91
Case Name
Status
Exec Time
Memory
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