题目描述
小明虽然发现了有趣回文数,但他觉得这种回文数不够完美。在他看来,偶数比素数更有意思,所以他将位数为偶数的回文数称为完美回文数。现在小明将所有的完美回文数从小到大进行排序,并算出前n个完美回文数的和,并将结果对p取模,聪明的你能在帮他一次吗?
输入
第一行输入一个整数T,代表实例的数量。(T <= 500)
每个实例输入两个整数n,p,意义如题中所示(1 ≤n≤ 100000, 1 ≤p≤ 1e9)。
输出
对于每个样例,输出一个整数,代表得到的结果。
样例输入
2
2 100
5 30
样例输出
33
15
直接找第n个稳稳超时,第n个偶数位回文数即是n+n反过来。例如第1个就是11,第二个是22,第三个是33~~;知道这个规律就可以好做了。
#include<bits/stdc++.h>
using namespace std;
long long a[100000];
long long h(long long n){
long long sum = 0, x = 0, q = n;
while (n){
sum = sum * 10 + n % 10;
n /= 10;
x++; //x来计算位数
}
sum = q*pow(10, x) + sum; //返回的即是第n个偶数位回文串
return sum;
}
int main(){
for (int i = 1; i <= 100000; i++)
a[i] = h(i); //打表
long long t, n, p;
cin >> t;
while (t--){
long long sum = 0;
cin >> n >> p;
for (int i = 1; i <= n; i++)
sum += a[i], sum %= p;
cout << sum << endl;
}
return 0;
}