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的数量
发现答案是
想到数论分块
做完了
注:一定要注意多取模
#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;
}

浙公网安备 33010602011771号