ABC 414

C - Palindromic in Both Bases

先求出1-10^12所有的回文数

再转成A进制判断是否也是回文数

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bits/stdc++.h>
#define int long long
#define jiaa(a,b) {a+=b;if(a>=MOD) a-=MOD;}
#define jian(a,b) {a-=b;if(a<0) a+=MOD;}
using namespace std;
int ksm(int a,int b,int p){
	if(b==0) return 1;
	if(b==1) return a%p;
	int c=ksm(a,b/2,p);
	c=c*c%p;
	if(b%2==1) c=c*a%p;
	return c%p;	
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int huiwen[3000005],cnt;
string a={"0123456789"};
char sss[1005];
signed main()
{
	//freopen("filename.in", "r", stdin);
	//freopen("filename.out", "w", stdout);
	for(int l=1;l<=12;l++){
		int mid=(1+l)>>1;
		int st=ksm(10,mid-1,10000000000);
		int en=ksm(10,mid,10000000000)-1;
		for(int i=st;i<=en;i++){
			string s=to_string(i);
			string t=s.substr(0,l>>1);
			reverse(t.begin(),t.end());
			string ans=s+t;
			huiwen[++cnt]=stoll(ans);
		}
	}
	int A=read(),n=read();
	int sum=0;
	for(int i=1;i<=cnt;i++){
		if(huiwen[i]>n) break;
		int xx=huiwen[i];
		int ccc=0;
		while(xx>0){
			int tt=xx%A;
			xx/=A;
			sss[++ccc]=a[tt];
		}
		int l=1,r=ccc;
		int f=0;
		while(l<=r){
			if(sss[l]!=sss[r]){
				f=1;
				break;
			}
			l++;
			r--;
		}
		if(!f) sum+=huiwen[i];
	}
	cout<<sum<<'\n';
	return 0;
}

D - Transmission Mission

先将x排序去重(观察第一个样例即可知道x会有重复且乱序)

考虑当两点间距过大时,往中间放基站一定不优

所以通过在两点左右两侧放基站覆盖这两点

于是考虑将两点间距排序

选取最大的M-1个(因为最多只能放M个基站)

这些间距不用管

因为最终所有点都要覆盖

所以答案是x[n]-x[1]-sum(前M-1大的间距)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bits/stdc++.h>
#define int long long
#define jiaa(a,b) {a+=b;if(a>=MOD) a-=MOD;}
#define jian(a,b) {a-=b;if(a<0) a+=MOD;}
using namespace std;
int ksm(int a,int b,int p){
	if(b==0) return 1;
	if(b==1) return a%p;
	int c=ksm(a,b/2,p);
	c=c*c%p;
	if(b%2==1) c=c*a%p;
	return c%p;	
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
int x[500005],cha[500005];
signed main()
{
	//freopen("filename.in", "r", stdin);
	//freopen("filename.out", "w", stdout);
	int n=read(),m=read();
	for(int i=1;i<=n;i++) x[i]=read();
	sort(x+1,x+n+1);
	int len=unique(x+1,x+n+1)-x-1;
	for(int i=1;i<len;i++){
		cha[i]=x[i+1]-x[i];
	}
	if(len<=m){
		cout<<0<<'\n';
		return 0;
	}
	sort(cha+1,cha+len);
	int ans=x[len]-x[1];
	for(int i=len-1;i>=len-m+1;i--){
		ans-=cha[i];
	}
	cout<<ans<<'\n';
	return 0;
}

E - Count A%B=C

首先从题目要求出发

由于3.a%b=c

所以可以将1、2条中所有的c换成a%b

即为:
1.1<=a,b,a%b<=n
2.a,b,a%b互不相同

因为当a>b时,a%b=a,所以a<b(此时a,b,a%b一定不同,且若a<=n,则b,a%b一定小于n)

因为a%b>=1,即a%b!=0,所以a不能整除b

所以要求变为:
1 ≤ b ≤ a ≤ N
a mod b ≠ 0
(这里包含进 b = a 的情况也可以,因为会被第二个条件排除)

考虑到算不整除的情况较麻烦,于是用总数量(n*(n+1)/2)减去整除的数量(a%b==0)即为答案

整除的情况只需要枚举b,计算a的数量

发现答案是image

想到数论分块

做完了

注:一定要注意多取模

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<bits/stdc++.h>
#define int long long
#define jiaa(a,b) {a+=b;if(a>=MOD) a-=MOD;}
#define jian(a,b) {a-=b;if(a<0) a+=MOD;}
using namespace std;
int ksm(int a,int b,int p){
	if(b==0) return 1;
	if(b==1) return a%p;
	int c=ksm(a,b/2,p);
	c=c*c%p;
	if(b%2==1) c=c*a%p;
	return c%p;	
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int MOD=998244353;
signed main()
{
	//freopen("filename.in", "r", stdin);
	//freopen("filename.out", "w", stdout);
	int n=read();
	int ans=0;
	for(int l=1,r=0;l<=n;l=r+1){
		int val=n/l;
		r=n/val;
		ans=(ans+(r-l+1)%MOD*val%MOD)%MOD;
	}
	cout<<(1ll*(n%MOD)*((n+1)%MOD)%MOD*(MOD+1)/2%MOD-ans+MOD)%MOD<<'\n';
	return 0;
}
posted @ 2025-07-12 22:08  gbrrain  阅读(113)  评论(0)    收藏  举报