Unintresting Number(数论)

链接:http://10.160.111.129/p/2582?tid=675966394f6a59fedf02b3dd

  • 题意:给你一个位数非常大的数,你可以随意改变在某一数位上的数字2或者3,使其相对应变为4或9,问你能不能变出来一个能被9整除,即是9的倍数的数。

  • 前置知识:
    对于9的倍数:任何数可以表示为10000....00a1+1000...0a2+.....+10a(n-1)+a(n) (a1,a2,....a(n)为每个数位上的数字)
    因为1000...00=9999..99+1
    所以可以表示为999...99
    a1+99...9a2+......+9a(n-1)//前面一部分能被9整除 + (a1+a2+...+a(n))
    只要数位加起来总和能被9整除,那这个数就是9的倍数
    也就是题目要求的数

  • 思路:
    我们先设置一个temp变量,将其加工为比n各数位之和sum大一点的9的倍数,然后通过2->4,3->9的操作 将sum 分别进行若干次的+2,+6操作
    看sum能否加工为temp

  • 注意:
    当temp-sum的差值为奇数时 要将其再加9变为偶数 (当然不能减9 因为你只能让sum+2或+6)
    先+6,再+2(因为+2比+6更加灵活)
    temp-sum的差值最多也就为18(其实取值就是为 0 , 2,4,6,8,10,12,14,16,18)

#include<bits/stdc++.h>
using namespace std;
signed main()
{
int t;
cin>>t;
while(t--)
{
int cnt[2]={0,0};
long long sum=0;
string n;cin>>n;
for(int i=0;i<n.size();i++)
{
if(n[i]=='2')cnt[0]++;
if(n[i]=='3')cnt[1]++;
sum+=n[i]-'0';
}
int temp=9;
while(sum>temp)
{
temp+=9;
}
sum=temp-sum;
if(sum%2==1)sum+=9;
while(cnt[1]&&sum>=6)
{
cnt[1]--;
sum-=6;
}
while(cnt[0]&&sum>=2)
{
cnt[0]--;
sum-=2;
}
if(sum==0)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
posted @   Marinaco  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示