题目描述
因为最近身边脱单的人太多了,于是 GBX 狂热的迷上了回文数。因为回文数看起来就像是一对恩爱狗站在一起,他希望自己将来也有那么一天(虽然并不可能)。这一天他突然想到一个问题,长度不大于 n 的自然数中有多少是回文数?因为数据很大,所以最后的结果请对 1000000007 取模。
输入
输入一个 T(T ≤ 100)表示 T 组数据。
对于每组数据输入一个整数 n(1 ≤ n ≤ 10^6 )。
对于每组数据输入一个整数 n(1 ≤ n ≤ 10^6 )。
输出
对于每组数据输出一个整数表示回文数的个数对 1000000007 取模的余数。
样例输入
2
1
2
样例输出
10
19
如果能找出规律就是一个水题,找不出就是一个你用模拟无法模拟出来的题。
一位数时 ? 可以是0-9是10个
二位数 ?? 只能是两个相同的数开头还不能为0,所以只有9种情况
三位数 ? ? ? 1 3位置必须相同有9种情况 2位置单独 可以为0-9有10种, 结果为9*10
四位数 ? ? ? ? 1 4位置必须相同有9种情况 2 3位置必须相同有10种 结果为9*10
五位数 ? ? ? ? ? 1 5位置9种 2 4 ,3都是10种 结果为9*10*10
即 每两次在多乘一个10, 一, 二的时候单独判断即可。
代码:
# include <stdio.h>
# define N 1000000007
int main(void)
{
int t;
scanf("%d", &t);
while (t --)
{
int n, c;
scanf("%d", &n);
if (n == 1)
{
printf("10\n");
continue;
}
if (n == 2)
{
printf("19\n");
continue;
}
long long sum = 19; // 前两次的和。
int i, d = 0;
long long sum1 = 90; //为3位数的值
for (i = 3; i <= n; i ++)
{
if (d == 2) // 每两次sum1的值更新一次
{
sum1 = (sum1*10)%N;
d = 1;
}
else
d ++;
sum = (sum+sum1)%N; // 每次都加sum1
}
printf("%lld\n", sum%N);
}
return 0;
}