CF897B Chtholly‘s request题解

该博客主要讨论了一种优化方法来解决计算前k个长度为偶数的回文数之和的问题。通过理解回文数的性质,即奇数加奇数为偶数,可以避免暴力枚举,直接找出前k个回文数并进行累加取模。代码中使用了快速读取和长整型累加器以确保效率和精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目传送门

题意就是求出前 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值