问题 : 恩爱的回文数

题目描述

因为最近身边脱单的人太多了,于是 GBX 狂热的迷上了回文数。因为回文数看起来就像是一对恩爱狗站在一起,他希望自己将来也有那么一天(虽然并不可能)。这一天他突然想到一个问题,长度不大于 n 的自然数中有多少是回文数?因为数据很大,所以最后的结果请对 1000000007 取模。

输入

输入一个 T(T ≤ 100)表示 T 组数据。
对于每组数据输入一个整数 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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值