#include <bits/stdc++.h>
using namespace std;
int dight[70][36],tmp[70][36];
int dp[70][100][100][36];
long long dfs(int start,int pos,int s,bool limit,int K) {
if(pos<0) return s;
if(!limit&&dp[pos][s][start][K]!=-1)
return dp[pos][s][start][K];
int tail,ret=0;
if (limit) tail=dight[pos][K];
else tail=K-1;
for (int d=0; d<=tail; ++d) {
tmp[pos][K]=d;
if(start==pos&&d==0)
ret+=dfs(start-1,pos-1,s,limit&&d==tail,K);
else if(s&&pos<(start+1)/2)
ret+=dfs(start,pos-1,tmp[start-pos][K]==d,limit&&d==tail,K);
else
ret+=dfs(start,pos-1,s,limit&&d==tail,K);
}
if(!limit)
dp[pos][s][start][K]=ret;
return ret;
}
long long solve(int a,int K) {
memset(dight,0,sizeof(dight));
int cnt=0;
while (a!=0) {
dight[cnt++][K]=a%K;
a/=K;
}
return dfs(cnt-1,cnt-1,1,1,K);
}
int main() {
memset(dp,-1,sizeof(dp));
int t,x,y,l,r,cnt=1;
long long ans,tmp;
scanf("%d",&t);
while(t--) {
scanf("%d%d%d%d",&x,&y,&l,&r);
ans=0;
for (int i=l; i<=r; ++i) {
tmp=solve(y,i)-solve(x-1,i);
ans+=i*tmp+(y-x+1-tmp);
}
printf("Case #%d: %I64d\n",cnt++,ans);
}
return 0;
}
HDU6156 Palindrome Function
最新推荐文章于 2021-09-09 15:57:04 发布