题目描述
小明虽然发现了有趣回文数,但他觉得这种回文数不够完美。在他看来,偶数比素数更有意思,所以他将位数为偶数的回文数称为完美回文数。现在小明将所有的完美回文数从小到大进行排序,并算出前n个完美回文数的和,并将结果对p取模,聪明的你能在帮他一次吗?
输入
第一行输入一个整数T,代表实例的数量。(T <= 500)
每个实例输入两个整数n,p,意义如题中所示(1 ≤n≤ 100000, 1 ≤p≤ 1e9)。
输出
对于每个样例,输出一个整数,代表得到的结果。
样例输入 Copy
2 2 100 5 30
样例输出 Copy
33 15
思路:先输出几组数据看一下.. 发现有规律可寻 位数为偶数的回文数 11 22 33 ... 101
规律:第n个数就是取反后合并 即是 n*10^(n的位数)+n(取反后的值) 就是第n个数了
找到规律后就好作了(第一次wa了 数据问题 第二次超时了(0.0))!
解决办法:开数组用前缀和存放前100000个数(a[n] = a[n-1] +n合并后的值) 数据开long long型 存放数组之后对于要询问的(n,p)直接输出a[n]%p 就OK了! 嘻嘻 ^.^ .
说的比较啰嗦 大家直接看代码
AC代码:
#include<stdio.h>
#include<math.h>
long long int pd(long long int n)// 合并数
{
long long int d=0,t=n,sum=0;
while(n)
{
sum=sum*10+n%10;
n/=10;
d++;
}
return t*pow(10,d)+sum;
}
int main()
{
long long int a[100001]={0};// 存放前100000个数
for(int i=1;i<=100000;i++)
a[i]=a[i-1]+pd(i); // 累加
int t;
scanf("%d",&t);
while(t--)
{
long long int n,p;
scanf("%lld %lld",&n,&p);
printf("%lld\n",a[n]%p);
}
return 0;
}
/**************************************************************
Time:19 ms
Memory:1904 kb
****************************************************************/