• 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;
    }
    
  • 相关阅读:
    java performance
    C# and Java: Comparing Programming Languages
    MYSQL blogs and articles
    网络基本功系列:细说网络那些事儿
    Spark 优化器 ML的论文
    逻辑回归
    MapReduce
    Spark
    Set-Theory-and-Logic
    k-means
  • 原文地址:https://www.cnblogs.com/stul/p/10012054.html
Copyright © 2020-2023  润新知