传送门:https://ac.nowcoder.com/acm/contest/2720/E
题意:给你一个n (n<=10 ^ ( 10 ^ 5 ) ),然后给你一种操作::每次操作你将得到上一个数的十进制所有数位之和,重复若干次直到最后的为一位数;
叫你找到数m(m>1),满足每次操作得到的数(包括n)要麽都能整除m要麽都不能
思路::
1)特判一下长度为1时,答案显然为 2;
2)当每次得到的数(包括n)均为奇数或者偶数时 答案显然为 2 ;
3)其他情况就是奇偶数都存在,仅考虑最后得到的那一位数,如果它能整除3说明 之前得到的数 全部能整除3(各位数之和能整除3即为3 的倍数),反之均不能整除3
因此 答案 就在2 3之间
1 #include <bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 const int maxn=1e6+5; 5 const int MOD=2333; 6 7 template<class T>inline void read(T &res) 8 { 9 char c;T flag=1; 10 while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; 11 while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; 12 } 13 14 char a[maxn]; 15 vector<int>v; 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--){ 21 v.clear(); 22 scanf("%s",a+1); 23 if(strlen(a+1)==1){ 24 printf("2\n");continue; 25 } 26 int sum=0; 27 for(int i=1,j=strlen(a+1);i<=j;i++){ 28 sum+=(a[i]-'0'); 29 } 30 v.push_back(sum); 31 while(sum>=10){ 32 int t=0; 33 while(sum!=0){ 34 t+=(sum%10); 35 sum/=10; 36 } 37 v.push_back(t); 38 sum=t; 39 } 40 v.push_back(sum); 41 int flag=0; 42 for(int i=0;i<v.size();i++){ 43 if(v[i]%2!=0){flag++;} 44 } 45 if((flag==v.size()&&a[strlen(a+1)]%2==1)||(flag==0&&a[strlen(a+1)]%2==0)){ 46 cout<<"2"<<endl; 47 } 48 else{ 49 cout<<"3"<<endl; 50 } 51 } 52 return 0; 53 }
不足之处还请指出!!!!