Submission #2549221


Source Code Expand

#include<bits/stdc++.h>
using namespace std;

#define je 1000000007

int su[16][16];
long long dp[16][65536];
long long mat[32][16][16];
long long sv[16][16];
long long vec[16], svec[16];

int main(){
	int n, m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			scanf("%d",&su[i][j]);
		}
	}
	int em = (1 << m);
	for(int ii=0;ii<m;ii++){
		for(int j=0;j<m;j++){
			for(int i=0;i<em;i++){
				dp[j][i] = 0;
			}
		}
		dp[ii][(1 << ii)] = 1;
		for(int i=0;i<em;i++){
			for(int j=0;j<m;j++){
				mat[0][ii][j] = (mat[0][ii][j] + dp[j][i]) % je;
				for(int k=0;k<m;k++){
					if(i & (1 << k)) continue;
					if(!su[j][k]) continue;
					dp[k][i + (1 << k)] = (dp[k][i + (1 << k)] + dp[j][i]) % je; 
				}
			}
		}
	}
	/*
	for(int i=0;i<m;i++){
		for(int j=0;j<m;j++){
			printf("%lld ", mat[0][i][j]);
		}
		printf("\n");
	}
	*/
	for(int i=1;i<=31;i++){
		for(int j=0;j<m;j++){
			for(int k=0;k<m;k++){
				sv[j][k] = mat[i-1][j][k];
			}
		}
		for(int kk=0;kk<m;kk++){
			for(int ii=0;ii<m;ii++){
				for(int jj=0;jj<m;jj++){
					long long cal = (sv[ii][kk] * sv[kk][jj]) % je;
					mat[i][ii][jj] = (mat[i][ii][jj] + cal) % je;
				}
			}
		}
	}
	int lvl = 0;
	vec[0] = 1;
	while(n){
		if(n & 1){
			for(int i=0;i<m;i++){
				svec[i] = vec[i];
				vec[i] = 0;
			}
			for(int i=0;i<m;i++){
				for(int j=0;j<m;j++){
					long long cal = (mat[lvl][i][j] * svec[j]) % je;
					vec[i] = (vec[i] + cal) % je;
				}
			}
			//printf("%lld %lld\n", vec[0], vec[1]);
		}
		n /= 2;
		lvl++;
	}
	printf("%lld\n", vec[0]);
}

Submission Info

Submission Time
Task M - 家
User jihoon
Language C++14 (GCC 5.4.1)
Score 5
Code Size 1618 Byte
Status AC
Exec Time 1121 ms
Memory 8448 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:14:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
                     ^
./Main.cpp:17:25: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d",&su[i][j]);
                         ^

Judge Result

Set Name All
Score / Max Score 5 / 5
Status
AC × 9
Set Name Test Cases
All 00, 01, 02, 03, 04, 05, 06, 90, 91
Case Name Status Exec Time Memory
00 AC 533 ms 8448 KB
01 AC 947 ms 8448 KB
02 AC 1091 ms 8448 KB
03 AC 1121 ms 8448 KB
04 AC 1054 ms 8448 KB
05 AC 932 ms 8448 KB
06 AC 460 ms 7552 KB
90 AC 1 ms 256 KB
91 AC 2 ms 2432 KB