zoukankan      html  css  js  c++  java
  • hdu 4432杯具

    题目还是挺简单的,就是硬算,先求出N的所有因数,然后一个个地加起来,最后再处理输出就行了。现场赛的时候,模板准备不足,这题居然打了一个多小时,唉,要是能早交20分钟,银牌就妥妥的了……杯具……

    /*
     * hdu4432/win.cpp
     * Created on: 2012-10-26
     * Author    : ben
     */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    typedef vector<pair<int, int> > Int_Pair;
    typedef long long LL;
    /*
     * 得到所有不超过N的素数表,存于容器pt中
     */
    void get_prime_table(int N, vector<int> &pt) {
        vector<bool> ip;
        ip.resize(N + 1);
        fill(ip.begin(), ip.end(), true);
        int i, j, s, t = N - 1;
        for (i = 3; i <= N; i++) {
            s = (int) sqrt(i);
            for (j = 2; j <= s; j++) {
                if (i % j == 0)    break;
            }
            if (j <= s) {
                ip[i] = false;
                t--;
            }
        }
        pt.resize(t);
        t = 0;
        for(int i = 2; i <= N; i++) {
            if(ip[i]) {
                pt[t++] = i;
            }
        }
    }
    /**
     * p为素数表,存下sqrt(N)的素数即可,f保存结果
     * f[i].first表示N的一个素因数,f[i].second为这个素因子的个数
     */
    void get_prime_factor(int N, Int_Pair &f, const vector<int> &p) {
        int i, t, n, pl = p.size();
        f.clear();
        for(i = 0; i < pl; i++) {
            t = p[i];
            if(N % t == 0) {
                n = 0;
                while(N % t == 0) {
                    n++;    N /= t;
                }
                f.push_back(make_pair(t, n));
            }
            if(N == 1) {    break;    }
        }
        if(N > 1) {
            f.push_back(make_pair(N, 1));
        }
    }
    
    void dfs(int k, int now, Int_Pair &f, vector<int> &data, vector<int> &ret) {
        if(k == (int)f.size()) {
            ret.push_back(now);
            return ;
        }
        data[k] = 0;
        while(data[k] <= f[k].second) {
            dfs(k + 1, now, f, data, ret);
            data[k]++;
            now *= f[k].first;
        }
    }
    inline LL getbitsum(int n, int m) {
        LL ret = 0, t;
        while(n > 0) {
            t = n % m;
            ret += t * t;
            n /= m;
        }
        return ret;
    }
    void myprint(LL ans, int m) {
        char str[100];
        int I = 0;
        char c;
        while(ans > 0) {
            c = ans % m + '0';
            if(c > '9') {
                c = c - '9' - 1 + 'A';
            }
            str[I++] = c;
            ans /= m;
        }
        str[I] = 0;
        reverse(str, str + I);
        puts(str);
    }
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("data.in", "r", stdin);
    #endif
        vector<int> prime_table;
        get_prime_table(100000, prime_table);
        int n, m;
        LL ans;
        while(scanf("%d%d", &n, &m) == 2) {
            Int_Pair factor;
            get_prime_factor(n, factor, prime_table);
            vector<int> data;
            data.resize(factor.size());
            vector<int> result;
            dfs(0, 1, factor, data, result);
            int len = result.size();
            ans = 0;
            for(int i = 0; i < len; i++) {
                ans += getbitsum(result[i], m);
            }
            myprint(ans, m);
        }
        return 0;
    }
  • 相关阅读:
    POJ 3624 Charm Bracelet 简单01背包
    POJ 1426 Find The Multiple BFS
    HDU 2612 Find a way BFS,防止超时是关键
    P3399 丝绸之路(线性二维dp)
    洛谷P1726 上白泽慧音(Tarjan强连通分量)
    codevs1557 热浪(堆优化dijkstra)
    P1462 通往奥格瑞玛的道路(二分答案+最短路)
    洛谷P1330 封锁阳光大学(二分图染色)
    洛谷P1341 无序字母对(欧拉回路)
    洛谷P1613 跑路(最短路+倍增)
  • 原文地址:https://www.cnblogs.com/moonbay/p/2741373.html
Copyright © 2011-2022 走看看