题意就是求出前 k 个长度为偶数的回文数的和,并输出其模 p 的结果。
思路此题如果用暴力枚举的方法的话一定是过不了的,所以要换一种方法来优化。
回文数应该都知道,就是由一个数和它的倒过来的数拼接而成,又因为奇数加奇数为偶数,偶数加偶数也为偶数,所以任何一个数的回文数均为偶数长度,依照这个规律,直接按顺序找出 zcy 数即可。
还要注意的是,毕竟需要一个累加器,所以还是要开 long long 的,并且时刻注意取模。
Code#include#include #include #include #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; }



