結果
| 問題 |
No.213 素数サイコロと合成数サイコロ (3-Easy)
|
| コンテスト | |
| ユーザー |
yaoshimax
|
| 提出日時 | 2015-05-24 22:50:52 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 505 ms / 3,000 ms |
| コード長 | 2,240 bytes |
| コンパイル時間 | 533 ms |
| コンパイル使用メモリ | 60,348 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-07-06 08:08:13 |
| 合計ジャッジ時間 | 1,628 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 2 |
ソースコード
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
long long N;
int P,C;
cin>>N>>P>>C;
int mod=1000000007;
int dp[130][P+1][6];
int dp2[130][C+1][6];
int pdice[]={2,3,5,7,11,13};
int cdice[]={4,6,8,9,10,12};
memset(dp,0,sizeof(dp));
memset(dp2,0,sizeof(dp2));
dp[0][0][0]=1;
for( int i=1 ; i<=P; i++ )for( int j=0;j<130;j++) for( int k=0; k<6; k++ ){//fill dp[j][i][k]
for( int l=0;l<=k; l++){
if(j-pdice[k]>=0)dp[j][i][k]+=dp[j-pdice[k]][i-1][l];
}
}
for(int i=0;i<130;i++){
for(int k=0; k<6; k++){
dp2[i][0][0]+=dp[i][P][k];
}
}
for( int i=1 ; i<=C; i++ )for( int j=0;j<130;j++) for( int k=0; k<6; k++ ){//fill dp2[j][i][k]
for( int l=0;l<=k; l++){
if(j-cdice[k]>=0)dp2[j][i][k]+=dp2[j-cdice[k]][i-1][l];
}
}
int pattern[130];
memset(pattern,0,sizeof(pattern));
int aSize=0;
for(int i=0;i<130;i++){
for( int k=0;k<6;k++){
pattern[i]+=dp2[i][C][k];
}
//cout << i<<","<<pattern[i]<<endl;
if(pattern[i]>0) aSize=max(aSize,i);
}
int A[aSize][aSize];
int V[aSize];
memset(A,0,sizeof(A));
memset(V,0,sizeof(V));
V[0]=1;
for( int i=0; i<aSize-1; i++){
A[i][i+1]=1;
}
for( int i=1; i<=aSize; i++){
A[i-1][0]=pattern[i];
}
/*
for( int i = 0 ; i <aSize; i++){
for( int j = 0 ; j < aSize;j++){
cout << A[i][j]<<" ";
}
cout << endl;
}
*/
int V2[aSize];
int A2[aSize][aSize];
while(N>0){
if( N%2==1 ){
memset(V2,0,sizeof(V2));
for( int i = 0 ; i<aSize ;i++ ){
for( int j = 0 ; j < aSize ; j++ ){
V2[i]=(V2[i]+A[i][j]*1LL*V[j])%mod;
}
}
memcpy(V,V2,sizeof(V2));
}
memset(A2,0,sizeof(A2));
for( int i=0;i<aSize;i++){
for(int j=0;j<aSize;j++){
for(int k=0;k<aSize;k++){
A2[i][j]=(A2[i][j]+A[i][k]*1LL*A[k][j])%mod;
}
}
}
memcpy(A,A2,sizeof(A2));
N/=2;
}
long long ans=0;
for( int i = 0 ; i < aSize; i++){
ans+=V[i];
ans%=mod;
}
cout << ans << endl;
return 0;
}
yaoshimax