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...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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现