結果

問題 No.213 素数サイコロと合成数サイコロ (3-Easy)
ユーザー koyumeishikoyumeishi
提出日時 2015-05-23 01:10:03
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 329 ms / 3,000 ms
コード長 1,976 bytes
コンパイル時間 626 ms
コンパイル使用メモリ 80,900 KB
実行使用メモリ 4,380 KB
最終ジャッジ日時 2023-09-20 10:19:33
合計ジャッジ時間 1,606 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 129 ms
4,376 KB
testcase_01 AC 329 ms
4,380 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <cstdio>
#include <sstream>
#include <map>
#include <string>
#include <algorithm>
#include <queue>
#include <cmath>
#include <set>
using namespace std;

#define MOD 1000000007

int a[] = {2,3,5,7,11,13};
int b[] = {4,6,8,9,10,12};


void dfs(vector<long long>& dp, int p, int c, int last_p, int last_c, int sum){
	if(p==0 && c==0){
		dp[sum]++;
		return;
	}
	if(p>0){
		for(int i=last_p; i<6; i++){
			dfs(dp, p-1, c, i, last_c, sum+a[i]);
		}
	}else if(c>0){
		for(int i=last_c; i<6; i++){
			dfs(dp, p, c-1, last_p, i, sum+b[i]);
		}
	}
}


//[n*p] * [p*m] => [n*m]
template<class T>
vector< vector<T> > multmat(const vector<vector<T> > &A, const vector<vector<T>> &B, int n, int p, int m){
	vector<vector<T> > C(n, vector<T>(m,0));
	for(int i=0; i<n; i++){
		for(int k=0; k<p; k++){
			for(int j=0; j<m; j++){
				C[i][j] += (A[i][k] * B[k][j]);
				C[i][j] %= MOD;
			}
		}
	}
	return C;
}

//A[n*n]^k 
template<class T>
vector< vector<T> > mat_pow(vector<vector<T> > A, long long k){
	int n = A.size();
	vector<vector<T> > ret(n, vector<T>(n, 0) );
	for(int i=0; i<n; i++){
		ret[i][i] = 1;
	}
	while(k>0){
		if(k&1) ret = multmat(A,ret, n,n,n);
		A = multmat(A,A, n,n,n);
		k>>=1;
	}
	return ret;
}


int main(){
	long long n;
	int p,c;
	cin >> n >> p >> c;

	int sz = 13*p + 12*c + 1;
	vector<long long> dp(sz, 0);
	dfs(dp, p,c, 0, 0, 0);


	vector<vector<long long>> V(sz, vector<long long>(sz, 0));
	for(int i=1; i<sz; i++){
		V[i-1][0] = dp[i];
	}
	for(int i=1; i<sz; i++){
		V[i-1][i] = 1;
	}

	vector<vector<long long>> X(sz, vector<long long>(1,0));
	X[0][0] = 1;

	auto M = mat_pow<long long>(V, n);
	auto L = multmat<long long>(M, X, sz, sz, 1);
/*
	for(int i=0; i<sz; i++){
		for(int j=0; j<sz; j++){
			cerr << M[i][j] << " ";
		}
		cerr << " | " << X[i][0] << " = " << L[i][0] << endl;;
	}
*/

	long long ans = 0;
	for(int i=0; i<sz; i++){
		ans += L[i][0];
		ans %= MOD;
	}

	cout << ans << endl;

	return 0;
}
0