3 solutions
-
1
- 对于任意进制 , 在 进制下的数位和 一定小于 (当 时, ,这是特殊情况)。因此:
- 若 :直接输出 (不可能存在满足条件的进制)。
- 若 :最小进制为 (此时 在 进制下是个位数,数位和为自身)。
- 进制的范围:
- 当 时:可直接枚举所有可能的进制,计算其数位和是否等于 。
- 当 时, 在 进制下为两位数 ( , ),数位和为 。结合 ,可得 ,即 是 的约数。枚举 从 到 (因 ,且 时 ):若 能被 整除,计算 。验证 且 ,若满足则输出 。
#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