提出 #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;
}

提出情報

提出日時
問題 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
結果
AC × 7
セット名 テストケース
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