专栏文章
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所以同样先用埃氏筛筛除质数,然后考虑每一个质数的搭配情况从0开始存储质数 答案就直接使用n/prime[i]*i得到
#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 条评论,欢迎与作者交流。
正在加载评论...