专栏文章

8.21

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio78yiq
此快照首次捕获于
2025/12/02 14:30
3 个月前
此快照最后确认于
2025/12/02 14:30
3 个月前
查看原文

T1

标记不是回文串的位置,如果修改的位置成功改成了回文串就计数器--,否则本来就不是改完不是不变,改完之后本来是后来不是++
CPP
#include<bits/stdc++.h>
using namespace std;
int len;
const int maxn = 1e5+7;
int vis[maxn];
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	string s;
	cin>>s;
	len=s.size();
	s='#'+s;
	int n;
	cin>>n;
	int cnt=0;
	for(int i=1;i<=len/2+1;i++) {
		if(s[i]!=s[len-i+1]) {
			cnt++;
			vis[i]=vis[len-i+1]=1;
		}
	}
	while(n--) {
		int x;
		char c;
		cin>>x>>c;
		s[x]=c;
		if(len%2==1&&x==len/2+1) {
			
		} else if(s[x]!=s[len-x+1]) {
			if(vis[x]==0) {
				cnt++,vis[x]=vis[len-x+1]=1;
			}
		} else {
			if(vis[x]==1) {
				cnt--;
			}
			vis[x]=vis[len-x+1]=0;
		}
		if(cnt==0) {
			cout<<"Yes"<<"\n";
		} else {
			cout<<"No"<<"\n";
		}
	return 0;
}

T2

将17转换成二进制变成10001,于是我们可以拆开来,分成10000和1,变成"0000"+s和s+"0000"来做二进制加法,注意最后面要算进的一位,还有在数位只有0的时候留一个0,然后去除前导0
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s,s1,s2;
signed main() {
	cin>>s;
	int len=s.size();
	for(int i=len-1;i>=0;i--) {
		s1=s1+s[i];
		s2=s2+s[i];
	}
	s1=s1+"0000",s2="0000"+s2;
	int tmp=0;
	string ans="";
	for(int i=0;i<=len+4;i++) {
		int t=s1[i]+s2[i]-2*'0'+tmp;
		ans=char('0'+(t%2+2)%2)+ans;
		tmp=t/2;
	}
	if(tmp==1) {
		ans='1'+ans;
	}
	int f=0;
	for(int i=0;i<ans.size();i++) {
		if(ans[i]=='1') {
			f=1;
		}
		if(ans[i]=='0'&&f==0) {
			continue;
		}
		cout<<ans[i];
	}
	return 0;
}

T3

暴力做法:用埃氏筛筛出质数然后枚举i,j,30pts 正解做法:如果两数/gcd互质,要么两个数都是质数,要么是同一个gcd*两个质数
所以同样先用埃氏筛筛除质数,然后考虑每一个质数的搭配情况从0开始存储质数 答案就直接使用n/prime[i]*i得到
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+7; 
int prime[maxn],cnt;
bool vis[maxn];
void ash(){
	vis[0]=vis[1]=1;
	for(int i=2;i<=1e6;i++){
		if(vis[i]==0){
			prime[cnt++]=i;
			for(int j=i+i;j<=1e6;j+=i){
				vis[j]=1;
			}
		}
	}
	return ;
}
struct Ans{
	int n,val,id;
	bool operator<(const Ans &w)const{
		return n<w.n;
	}
}ans[maxn];
long long outp[maxn];
int main(){
	ash();
	cnt--;
	int t;
	cin>>t;
	for(int i=1;i<=t;i++){
		cin>>ans[i].n;
		ans[i].id=i;
	}
	sort(ans+1,ans+1+t);
	int pos=0;
	for(int i=1;i<=t;i++){
		while(pos+1<=cnt&&prime[pos+1]<=ans[i].n){
			pos++;
		}
		long long num=0;
		for(int j=0;j<=pos;j++){
			long long xx=ans[i].n/prime[j];
			num+=xx*j;
		}
		num*=2;
		outp[ans[i].id]=num;
	}
	for(int i=1;i<=t;i++){
		cout<<outp[i]<<"\n";
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...