一个很典型的数位统计,统计0-n中p进制下字符k出现了多少次。
最不会的题目就是数位统计了,每次写这种题都写得头晕。今天先是想学学数位dp的,但学了一下午还是不会……还是太弱了。
直到晚上还是用普通的统计方法写了,这题有一个奸诈之处就是k可能大于p……
真的弱爆了,现在啥都不会了,继续好好刷题,希望元旦之前可以推进到dp,每天至少一题
/* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <math.h> using namespace std; int main() { long long n; int base,A,now; char aim; long long b[65]={0,1},c[65]={0,1},i; while(~scanf("%lld%d%*c%c",&n,&base,&aim)) { if(aim>='0'&&aim<='9')A=aim-'0'; else if(aim>='A'&&aim<='Z')A=aim-'A'+10; else A=aim-'a'+36; if(A==0&&n==0){printf("1\n");continue;} if(A>=base){printf("0\n");continue;} long long level,ans=0,now; level=(1.0*log(n)/log(base))+1.0; for(i=2;i<=level;i++) { b[i]=base*b[i-1]; c[i]=b[i]*i; } for(i=level;i>0;i--) { now=n/b[i];n%=b[i]; ans+=now*c[i-1]; if(now>A)ans+=b[i]; if(now==A)ans+=n+1; } if(A==0) { for(i=level;i>0;i--) ans-=b[i]; ans++; } printf("%lld\n",ans); } }