結果
| 問題 | 
                            No.213 素数サイコロと合成数サイコロ (3-Easy)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             yaoshimax
                         | 
                    
| 提出日時 | 2015-05-24 22:50:20 | 
| 言語 | C++11(廃止可能性あり)  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,226 bytes | 
| コンパイル時間 | 527 ms | 
| コンパイル使用メモリ | 59,376 KB | 
| 実行使用メモリ | 814,976 KB | 
| 最終ジャッジ日時 | 2024-07-06 08:08:10 | 
| 合計ジャッジ時間 | 2,289 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | WA * 1 MLE * 1 | 
ソースコード
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
   int N,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