传送门: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 }

不足之处还请指出!!!!

12-23 10:31