Submission #2448275
Source Code Expand
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef unsigned long long int ull; typedef unsigned int ui; #define MAX(a,b) ((a)>(b)?(a):(b)) #define MIN(a,b) ((a)<(b)?(a):(b)) #define ABS(a) ((a)>(0)?(a):-(a)) const ui mod=1000000007; ui *tmp; void mul(ui *c,ui *a,ui *b,const ui k){ ui i,j; for(i=0;i<2*k-1;i++) tmp[i]=0; for(i=0;i<k;i++){ for(j=0;j<k;j++){ tmp[i+j]=(tmp[i+j]+(ull)a[i]*b[j])%mod; } } for(i=2*k-2;i>=k;i--){ for(j=1;j<=k;j++){ tmp[i-j]=(tmp[i-j]+tmp[i])%mod; } } for(i=0;i<k;i++) c[i]=tmp[i]; return; } ui calc(ui n,ui k){ if(n<k) return 1; ui *t=(ui *)calloc(k,sizeof(ui)); ui *s=(ui *)calloc(k,sizeof(ui)); tmp=(ui *)calloc(2*k-1,sizeof(ui)); s[1]=1; t[0]=1; while(n>0){ if(n&0x01) mul(t,t,s,k); mul(s,s,s,k); n>>=1; } ui res=0; ui i; for(i=0;i<k;i++) res=(res+t[i])%mod; free(t); free(s); free(tmp); return res; } void run(void){ ui k,n; scanf("%d%d",&k,&n); ui ans=calc(n-1,k); printf("%d\n",ans); return; } int main(void){ run(); return 0; }
Submission Info
Submission Time | |
---|---|
Task | T - フィボナッチ |
User | sansen |
Language | C (Clang 3.8.0) |
Score | 8 |
Code Size | 1145 Byte |
Status | AC |
Exec Time | 166 ms |
Memory | 128 KB |
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 | 166 ms | 128 KB |
01 | AC | 86 ms | 128 KB |
02 | AC | 150 ms | 128 KB |
03 | AC | 25 ms | 128 KB |
04 | AC | 1 ms | 128 KB |
90 | AC | 1 ms | 128 KB |
91 | AC | 1 ms | 128 KB |