题目传送门
题意就是求出前 k 个长度为偶数的回文数的和,并输出其模 p 的结果。
思路
此题如果用暴力枚举的方法的话一定是过不了的,所以要换一种方法来优化。
回文数应该都知道,就是由一个数和它的倒过来的数拼接而成,又因为奇数加奇数为偶数,偶数加偶数也为偶数,所以任何一个数的回文数均为偶数长度,依照这个规律,直接按顺序找出 zcy 数即可。
还要注意的是,毕竟需要一个累加器,所以还是要开 long long 的,并且时刻注意取模。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
ll k,p,u,ans;
inline ll read()//快读优化
{
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
void work()
{
for(ll i=1;i<=k;i++){//枚举前k个数,都符合要求
ll t=i,q=0,o=1;
while(t){
q=q*10+t%10;//求倒过来的数
t/=10;
o*=10;//用于回文数的拼接
}
ll sum=i*o+q;//拼接
ans=ans%p+sum;//累加取模
}
}
int main()
{
k=read(),p=read();
work();
printf("%lld",ans%p);//为了保险,输出时再模一次
return 0;
}