Ecust DIV3 k进制 【暴力不断优化】

K进制

Description

给定一个正整数n,请你判断在哪些进制下n的表示恰好有2位是1,其余位都是0。

Input

输入第一行为整数TT,表示有TT组数据(1 \le T \le 50)(1≤T≤50)

每组数据包含一个整数n(3 \le n \le 1000000000)n(3≤n≤1000000000)

输入保证一定有解

Output

对于每组数据,从小到大输出每一个符合要求的进制,每个一行

Sample Input 1

1
10

Sample Output 1

2
3
9
看着题解做的。
恰好有2位是1,其余位都是0。 所以 n = pow(k,a) + pow (k,b) 且 a != b;
实现的时候容易超时,最开始用的三重循环,稳稳地超时。
然后修改了一下 用 temp = pow(k,b) = n - pow(k,a),然后用while循环计算出b的值。 还是超时
处理 j = k,a = 1, 每次j*=k,a++; j < n 的时候继续循环。
#include <bits/stdc++.h>
#define ll long long
using namespace std; int main(){
int t;
cin>>t;
while(t--){
ll n;
cin>>n;
for(ll k = 2; k*k <= n; k++)
for(ll a = 1,j = k; j < n; a++, j =j*k){
ll b = 0;
ll temp = n - j;
while(temp%k==0) {
temp/=k;b++;
}
if(temp == 1 && a != b){
cout<<k<<endl;break;
}
} cout<<n-1<<endl; }
return 0;
}
上一篇:springboot 获取hibernate 的 SessionFactory


下一篇:jquery为新增元素添加事件