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 @ 2024-12-18 21:17  Marinaco  阅读(10)  评论(0)    收藏  举报
//雪花飘落效果