3 solutions

  • 0
    @ 2025-12-14 14:59:10

    分类讨论:
    (n)b(n)_b 是一位数时,必有 f(b,n)=nf(b,n)=n。这一部分可以特判掉(nsn \le s)。
    (n)b(n)_b 为至少三位的数,n2>bn^2 > b。此时一定有 bnb \le \sqrt{n}。循环解决。
    否则, (n)b(n)_b 是两位数,则:
    n=bk+pn=bk+p
    s=k+ps=k+p
    ns=(b1)kn-s=(b-1)k
    因此可以枚举 (ns)(n-s) 的因数进行判断。
    总时间复杂度 O(n)O(\sqrt{n}),可以通过。

    #include<bits/stdc++.h>
    #define please using
    #define dont namespace
    #define copy std
    please dont copy;
    long long f(long long b,long long n){
    	if(n<b)return n;
    	return f(b,n/b)+n%b;
    }
    int main(){
    	long long n,s;
    	scanf("%lld%lld",&n,&s);
    	if(n<s){
    		puts("-1");
    		return 0;
    	}
    	if(n==s){
    		printf("%lld",n+1);
    		return 0;
    	}
    	long long x=sqrt(n)+1;
    	for(long long i=2;i<=x;i++){
    		if(f(i,n)==s){
    			printf("%lld",i);
    			return 0;
    		}
        }
    	long long ans=0;
    	for(long long i=1;i<=x;i++){
    		if((n-s)%i)continue;
    		if(f((n-s)/i+1,n)==s)ans=(n-s)/i+1;
        }
    	if(ans==0)puts("-1");
    	else printf("%lld",ans);
    }
    

    Information

    ID
    608
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    42
    Accepted
    8
    Uploaded By