• 【2017中国大学生程序设计竞赛


    【链接】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;
    }
    


  • 相关阅读:
    浅谈Java中的栈和堆
    Java运行时内存划分
    浅谈Static
    浅谈同一家公司多个系统,共用登录用户名和密码
    浅谈Final
    浅谈StringBuffer
    浅谈加密算法BCrypt
    序列表 批量的含义
    安装activemq和java代码实现生产和消费
    Restful
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626100.html
Copyright © 2020-2023  润新知