1. 程式人生 > >Ecust DIV3 k進位制 【暴力不斷優化】

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;
}