蕊蕊识数
从题意看,能被整除的数感觉不是2就是3(提交后发现大佬的确是这么做的),然而我并不能证明。所以暴力来一发(观察题目会发现除了初始的n和第一次的和可能较大,其他数字都是比较小的,因此枚举循环次数应该不多)。
从2枚举找到满足条件数字,由于n很大,作了一个高精度除法。
#include <bits/stdc++.h> typedef long long ll; using namespace std; string s; int a[100005];/**< a存储高精度 */ int test(int x)/**< 测试一下存在a数组的高精度数字能否被x整除 */ { int i,j,y=a[s.size()-1]; for(i=s.size()-2; i>=0; i--) y=y%x*10+a[i]; if(y%x==0) return 1; else return 0; } int main() { ios::sync_with_stdio(0),cin.tie(0); int i,j,t,sum; cin>>t; while(t--) { memset(a,0,sizeof(a)); sum=0; cin>>s; for(i=0; i<s.size(); i++) { a[i]=s[s.size()-1-i]-'0'; sum+=a[i]; } int b[10],total=1; b[1]=sum; while(sum>=10) { int s=0; while(sum) s+=sum%10,sum/=10; sum=s; b[++total]=sum; } for(j=2;; j++)/**< 暴力检查满足条件的j,除了开始的n和第一次的sum外,其他数字都很小,因此考虑暴力枚举的方法 */ { if(test(j)==1) /**< 能整除情况 */ { for(i=1; i<=total; i++) { if(b[i]%j!=0) break; } if(i>total) { cout<<j<<endl; break; } } else/**< 不能整除情况 */ { for(i=1; i<=total; i++) { if(b[i]%j==0) break; } if(i>total) { cout<<j<<endl; break; } } } } return 0; }