【2017中国大学生程序设计竞赛 - 网络选拔赛】Palindrome Function
【链接】http://acm.hdu.edu.cn/showproblem.php?pid=6156
【题意】
已知函数f(x, k),如果10进制数x在k进制下是个回文数,那么f(x, k)值为k,否则为1
现给出l, r, x, y, 求出∑∑f(i, j) (l<=i<=r) (x<=j<=y)
【题解】
如果会求10进制的回文数个数问题的话,多少进制都能求了.
在这个程序的基础上把十进制改成base进制就好
剩下的不难写
【错的次数】
0
【反思】
在这了写反思
【代码】
#include <bits/stdc++.h> #define int long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define ms(x,y) memset(x,y,sizeof x) #define ri(x) scanf("%d",&x) #define rl(x) scanf("%lld",&x) #define rs(x) scanf("%s",x+1) #define oi(x) printf("%d",x) #define ol(x) printf("%lld",x) #define oc putchar(' ') #define os(x) printf(x) #define all(x) x.begin(),x.end() #define Open() freopen("F:\\rush.txt","r",stdin) #define Close() ios::sync_with_stdio(0) const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; using namespace std; const int MAXN = 110; int dp[40][MAXN][MAXN][2]; int num[MAXN],temp[MAXN],base; int dfs(int start,int cur,bool state,bool f) { if(cur<0) return state; if(!f&&dp[base][start][cur][state]!=-1) return dp[base][start][cur][state]; int en=f?num[cur]:base-1; int ans=0; for(int i=0;i<=en;i++) { temp[cur]=i; if(start==cur&&i==0) { ans+=dfs(start-1,cur-1,state,f&&i==en); } else if(state&&cur<(start+1)/2) { ans+=dfs(start,cur-1,temp[start-cur]==i,f&&i==en); } else { ans+=dfs(start,cur-1,state,f&&i==en); } } if(!f&&ans>=0) dp[base][start][cur][state]=ans; return ans; } int f(int n) { int len=0; while(n) { num[len++]=n%base; n/=base; } num[len]=0; return dfs(len-1,len-1,1,1); } main() { ios::sync_with_stdio(false); int t; cin >> t; memset(dp,-1,sizeof dp); int cas = 0; while(t--) { int L,R,l,r; cin >> L >> R >> l >> r; int ans = 0; for (base = l;base <= r;base++) { int num = f(R)-f(L-1); ans = ans + (num)*base; ans = ans + R-L + 1 - num; } cout << "Case #" << ++cas <<": "<<ans<<endl; } return 0; }