题目链接:here
假设n=b0+b1+b2....+bk
如果b2<=n,那么那么n在b进制下有多个数组成,可以直接暴力算
如果暴力没有正确的结果,即:
如果b2>n,那么n在b进制下只有两个数组成
要组成回文树,则xb+x=n b=n/x-1 ,(n%x==0,x<b),要求b最小,则使x最大, 从sqrt(n+1)开始枚举x即可
#include<iostream> #include<cstdio> #include<cmath> using namespace std; #define ll long long ll a[100]; bool ok(int k,ll n) { int cnt=0; while(n) { a[cnt++]=n%k; n/=k; } for(int i=0;i<cnt/2;i++) { if(a[i]!=a[cnt-i-1])return false; } return true; } int main() { int T; ll n; scanf("%d",&T); while(T--) { scanf("%lld",&n); bool flag=false; for(int i=2;i<100010;i++) { if(ok(i,n)) { printf("%d\n",i); flag=true; break; } } if(flag)continue; int p=sqrt(n+1); for(int i=p;i>=1;i--) { if(n%i==0) { printf("%lld\n",n/i-1); break; } } } return 0; } /* 9974 */
时间: 2024-11-05 22:02:25