链接: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...99a1+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;
}
标签:...,cnt,temp,数论,sum,Number,--,Unintresting,数位
From: https://www.cnblogs.com/benscode/p/18615866