专栏文章
题解 CF2050C
CF2050C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miqtvdqo
- 此快照首次捕获于
- 2025/12/04 10:39 3 个月前
- 此快照最后确认于
- 2025/12/04 10:39 3 个月前
题意:
给定一个大数,每次可以对任意一个十进制位乘方然后放回原处,不允许增加位数,问随意操作后是否可以整除 。
思路:
题目不允许增加位数,只有 可以操作,而 不会产生任何贡献,直接考虑 。
当对 进行乘方操作时, 会变成 ,对结果的贡献是 。同理, 进行操作的贡献是 。要使最终大数整除 ,必须使其数位之和整除 。
不难发现实际的有效位数并不多,如果我们有足够的 (多于 个),必然可以直接判可行,选定其中一些 乘方必然可以涵盖所有除以 的余数情况。而对于 ,它对结果余数的贡献是 的循环,实际最多需要考虑的有效位数只有 位。
只需要考虑小于 个 和 个 ,直接暴力。
程序如下:
CPP#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n;
char ch[100005];
int main(){
scanf("%d",&T);
while(T--){
scanf("%s",ch+1);
n=strlen(ch+1);
int tot=0,cnt2=0,cnt3=0;
for(int i=1;i<=n;i++){
tot+=ch[i]-'0';
if(ch[i]=='2')cnt2++;
if(ch[i]=='3')cnt3++;
}
if(cnt2>=9||tot%9==0||(tot%3==0&&cnt3>=3)){
printf("YES\n");
continue;
}
bool flag=false;
int newtot=tot;
for(int j=1;j<=cnt3&&j<=3;j++){
newtot+=6;
if(newtot%9==0){
flag=true;
break;
}
}
for(int i=1;i<=cnt2;i++){
tot+=2;
if(tot%9==0){
flag=true;
break;
}
int newtot=tot;
for(int j=1;j<=cnt3&&j<=3;j++){
newtot+=6;
if(newtot%9==0){
flag=true;
break;
}
}
if(flag)break;
}
if(flag)printf("YES\n");
else printf("NO\n");
}
return 0;
}
THE END
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...