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

K进制

Description

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

Input

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

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

输入保证一定有解

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;
}
原文地址:https://www.cnblogs.com/stul/p/10012054.html