제출 #1325211

#제출 시각아이디문제언어결과실행 시간메모리
1325211gs12117The last wizard (kriii2_T)C++17
4 / 4
55 ms4524 KiB
#include<cstdio>
int n, base;
long long int train;
const int mod = 1000000007;
long long int multsum[1024];
long long int cmultsum[1024];
long long int c[1024];
long long int d[1024];
int vlist[1024][1024];
int vll[1024];
int minc[12];
void buildc(long long int y) {
	if (y == 0)return;
	buildc(y / 2);
	for (int i = 0; i < (1 << 10); i++) {
		d[i] = 0;
		for (int j = 0; j < vll[i]; j++) {
			int x = vlist[i][j];
			d[i] += c[i - x] * c[x];
			d[i] %= mod;
		}
	}
	for (int i = 0; i < (1 << 10); i++) {
		c[i] = d[i];
	}
	if (y % 2 == 1) {
		for (int i = 0; i < (1 << 10); i++) {
			d[i] = 0;
			for (int j = 0; j < vll[i]; j++) {
				int x = vlist[i][j];
				d[i] += c[i - x] * multsum[x];
				d[i] %= mod;
			}
		}
		for (int i = 0; i < (1 << 10); i++) {
			c[i] = d[i];
		}
	}
}
int main() {
	scanf("%lld%d%d", &train, &n, &base);
	int cbase = base;
	for (int i = 0; i < n; i++) {
		int p = 0;
		scanf("%d", &p);
		for (int j = 0; j < 10; j++) {
			scanf("%d", &minc[j]);
		}
		cbase -= p;
		cmultsum[0] = 1;
		for (int j = 0; j < 10; j++) {
			for (int k = 0; k < (1 << j); k++) {
				cmultsum[k + (1 << j)] = cmultsum[k] * minc[j] % mod;
			}
		}
		for (int j = 0; j < (1 << 10); j++) {
			multsum[j] += cmultsum[j] * p;
			multsum[j] %= mod;
		}
	}
	multsum[0] += cbase;
	multsum[0] %= mod;
	for (int i = 0; i < (1 << 10); i++) {
		for (int j = 0; j <= i; j++) {
			if ((i & j) != j)continue;
			vlist[i][vll[i]] = j;
			vll[i]++;
		}
	}
	c[0] = 1;
	buildc(train);
	long long int ans = 0;
	for (int i = 0; i < (1 << 10); i++) {
		ans += c[i];
		ans %= mod;
	}
	printf("%lld\n", ans);
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

T.cpp: In function 'int main()':
T.cpp:41:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |         scanf("%lld%d%d", &train, &n, &base);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
T.cpp:45:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |                 scanf("%d", &p);
      |                 ~~~~~^~~~~~~~~~
T.cpp:47:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |                         scanf("%d", &minc[j]);
      |                         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...