Difference
题意:
f(233,2)=22+32+32=22 x=f(y,K)−y 现在给出x,k 求可能的y有多少个
思路:
0≤x≤10^9 1≤K≤9 y>10^10时,f(y,k)−y≤0(下面代码是证明过程)
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; int sum[20][20]; ll fum(ll i){ ll s=0; while(i){ s=s*10+9; i--; } return s; } int main() { for(int i = 1; i < 10; i++) { sum[i][0] = 1; for(int j = 1; j <= 9; j++) { sum[i][j] = sum[i][j - 1] * i; } } freopen("out.txt", "w", stdout); ll i; for(i=8;i<=15;i++){ if(i*sum[9][9]<fum(i)){ cout<<i<<endl; break; } } fclose(stdout); return 0; }
输出10
因为y最长是是个字符,那么就可以把y分成两部分来二分查找(后来知道这种思想叫折半枚举),一部分是前五位,一部分是后五位。
代码:
这个是求n^n模板
int sum[20][20]; for(int i = 1; i < 10; i++) { sum[i][0] = 1; for(int j = 1; j <= 9; j++) { sum[i][j] = sum[i][j - 1] * i; } }