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