当输入的n和m很大的时候代码输出为什么是错的?
  • 板块CF1513C Add One
  • 楼主52wyd
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/3/24 08:10
  • 上次更新2023/10/23 20:43:48
查看原帖
当输入的n和m很大的时候代码输出为什么是错的?
816549
52wyd楼主2023/3/24 08:10
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int mod = 1e9 + 7;

inline int read() {
	int s = 0, w = 1;
	char c = getchar();
	while (c < '0' || c > '9') {if (c == '-') w = -1; c = getchar();}
	while (c >= '0' && c <= '9') s = s * 10 + c - '0', c = getchar();
	return s * w;
}

int n, m;
long long a[10][200010];
// a[初始数字][扩展次数] = 扩展后的位数

int main() {	
	for (int i = 0; i <= 9; i ++) {
		a[i][0] = 1;
	}
	
	for (int i = 0; i <= 9; i ++) { // 初始数字
		for (int j = 1; j <= 200000; j ++) { // 扩展次数
			a[i][j] = a[i][j-1];
			if (j >= 11)
				a[i][j] = (a[i][j] + a[i][j-9] - a[i][j-10] + a[i][j-10] - a[i][j-11]) % mod;
			/*
			  因为数字9由0和1增加得到
			  所以:a[i][j-9] - a[i][j-10] + a[i][j-10] - a[i][j-11]
			  表示数字i扩展j次后的数字中数字9的个数。
			  其中a[i][j-9] - a[i][j-10]是数字i在扩展第j-9次后
			  新出现的数字1的个数;
			  其中a[i][j-10] - a[i][j-11]是数字i在扩展第j-10次后
			  新出现的数字0的个数;
			 */
			else if (j == 10 - i || i == 9 && j == 10)
				a[i][j] = (a[i][j] + 1) % mod;
		}
	}
	
	int t = read();
	while (t --) {
		n = read(); m = read();
		long long sum = 0;
		while (n) {
			sum = (sum + a[n%10][m]) % mod;
			n /= 10;
		}
		printf("%lld\n", sum);
	}
	
	return 0;
}

2023/3/24 08:10
加载中...