3 solutions

  • 1
    @ 2025-12-14 17:00:31
    1. 对于任意进制 bb , nn 在 bb 进制下的数位和 f(b,n)f(b,n) 一定小于 nn(当 b>nb>n 时, f(b,n)=n f(b,n)=n ,这是特殊情况)。因此:
    • 若 s>ns>n :直接输出 1-1 (不可能存在满足条件的进制)。
    • 若 s=ns=n :最小进制为 n+1n+1(此时 nn 在 n+1n+1 进制下是个位数,数位和为自身)。
    1. 进制的范围:
    • 当 bnb\leq\sqrt{n} 时:可直接枚举所有可能的进制,计算其数位和是否等于 ss
    • 当 b>nb>\sqrt{n} 时, nn 在 bb 进制下为两位数 qb+rqb+rq=n/bq=\lfloor n/b \rfloorr=nmodbr=n\mod b ),数位和为 q+r=sq+r=s。结合 n=qb+rn=qb+r ,可得 ns=q(b1)n-s=q(b-1) ,即 qq 是 nsn-s 的约数。枚举 qq 从 11 到 n\sqrt{n} (因 q=(ns)/(b1)q=(n-s)/(b-1) ,且 b>nb>\sqrt{n} 时 q<nq<\sqrt{n} ):若 (ns)(n-s) 能被 qq 整除,计算 b=(ns)/q+1b=(n-s)/q+1 。验证 b>nb>\sqrt{n} 且 f(b,n)=sf(b,n)=s ,若满足则输出 bb
    #include<bits/stdc++.h>
    using namespace std;
    #define FAST_IO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
    #define int long long
    #define MAXN 100005
    int n,s;
    int __sqrt(int x)
    {
        if(x==0) return 0;
        int l=1,r=x;
        while(l<=r)
    	{
            int mid=l+(r-l)/2;
            if(mid<=x/mid) l=mid+1;
            else {r=mid-1;}
        }
        return r;
    }
    int f(int b,int n)
    {
    	if(n<b) return n;
    	else {return f(b,n/b)+n%b;}
    }
    signed main()
    {
    	FAST_IO;
    	cin>>n>>s;
    	if(s>n) {cout<<"-1\n";return 0;}
    	if(s==n) {cout<<n+1<<'\n';return 0;}
    	int sq=__sqrt(n);
    	for(int i=2;i<=sq;i++)
    	{
    		if(f(i,n)==s) {cout<<i<<'\n';return 0;} 
    	}
    	for(int i=sq;i>=1;i--) 
    	{
    		int val=(n-s)/i+1;
    		if((n-s)%i==0&&f(val,n)==s) {cout<<val<<'\n';return 0;}
    	}
    	cout<<"-1\n";
    	return 0;
    }
    

    Information

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