Ecust DIV3 k進位制 【暴力不斷優化】
阿新 • • 發佈:2018-11-24
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; }