题解 AT2038 【桁和 / Digit Sum】
推一下博客
总结:数学题
被数学题虐爆...研究了好久的题解才明白这题...
题意:给一个函数
我们可以分成两种情况来讨论
当
当
设
这时的
所以
即
因为
复杂度是
#include <bits/stdc++.h>
using namespace std ;
#define inf 0x3f3f3f3f
#define ll long long
ll n , s ;
ll f( ll b , ll n ) {
return n < b ? n : f( b , n / b ) + n % b ;
}
int main() {
scanf( "%lld%lld" , &n , &s ) ;
if( s > n ) return puts( "-1" ) , 0 ;
if( s == n ) return printf( "%lld\n" , n + 1 ) , 0 ;
ll m = sqrt( n ) + 1 ;
for( ll i = 2 ; i <= m ; i ++ ) {
if( f( i , n ) == s )
return printf( "%lld" , i ) , 0 ;
}
ll ans = 1e11 ; n -= s ;
for( ll i = 1 ; i * i <= n ; i ++ ) {
if( n % i == 0 ) {
ll b = n / i + 1;
if( f ( b , n + s ) == s ) ans = min ( ans , b ) ;
}
}
printf( "%lld\n" , ans != 1e11 ? ans : -1 ) ;
return 0 ;
}