zoukankan      html  css  js  c++  java
  • [hdu5525 Product]暴力

    题意:给定n和a[],令N = ∏(1≤i≤n)ia[i],求N的所有约数的积(取模1e9+7)

    思路:

    • 假定N因式分解后的结果是2p1*3p2*5p3*...,如何计算答案呢?
    • 单独看2p1这一项,考虑它所有的贡献,它在N的约数里面总共会出现P=(p2+1)*(p3+1)*...次,由于是求乘积,而且2的指数可以取[0,p1],那么它总共产生的答案为(20)P*(21)P*(22)P*...=2(p1+1)*p1/2 * P=2p1*M/2,其中M=(p1+1)*(p2+1)*(p3+1)*...
    • 因此答案就是2p1*M/2*3p2*M/2*5p3*M/2*...
    • 所以首先把N的因式分解式求出来,然后按照上述公式求解即可
    #include <bits/stdc++.h>
    using namespace std;
    #define X first
    #define Y second
    #define pb(x) push_back(x)
    #define mp(x, y) make_pair(x, y)
    #define all(a) (a).begin(), (a).end()
    #define mset(a, x) memset(a, x, sizeof(a))
    #define mcpy(a, b) memcpy(a, b, sizeof(b))
    #define cas() int T, cas = 0; cin >> T; while (T --)
    template<typename T>bool umax(T&a, const T&b){return a<b?(a=b,true):false;}
    template<typename T>bool umin(T&a, const T&b){return b<a?(a=b,true):false;}
    typedef long long ll;
    typedef pair<int, int> pii;
    
    #ifndef ONLINE_JUDGE
        #include "local.h"
    #endif
    
    const int mod = 1e9 + 7;
    const int N = 1e5 + 7;
    
    vector<int> prime;
    ll total[N];
    bool used[N];
    int a[N], ID[N];
    
    void getPrime() {
        for (ll i = 2; i < N; i ++) {
            if (!used[i]) {
                prime.pb(i);
                for (ll j = i * i; j < N; j += i) used[j] = true;
            }
        }
        for (int i = 0; i < prime.size(); i ++) {
            ID[prime[i]] = i;
        }
    }
    
    pair<vector<int>, vector<int> > Y[N];
    
    vector<int> fac;
    vector<int> cnt;
    
    void div(int x) {
        if (x > 2 && !used[x]) {
            fac.pb(x);
            cnt.pb(1);
            return;
        }
        for (int i = 0; i < prime.size() && prime[i] <= x;  i ++) {
            int c = 0;
            while (x % prime[i] == 0) {
                c ++;
                x /= prime[i];
            }
            if (c) {
                fac.pb(prime[i]);
                cnt.pb(c);
            }
            if (x < prime[i]) break;
        }
    }
    
    ll powermod(ll a, ll n, ll mod) {
        ll ans = 1;
        while (n) {
            if (n & 1) ans = ans * a % mod;
            a = a * a % mod;
            n >>= 1;
        }
        return ans;
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        //freopen("out.txt", "w", stdout);
    #endif // ONLINE_JUDGE
        getPrime();
        for (int i = 1; i < N; i ++) {
            fac.clear();
            cnt.clear();
            div(i);
            Y[i] = mp(fac, cnt);
        }
        int n;
        while (cin >> n) {
            for (int i = 1; i <= n; i ++) {
                scanf("%d", a + i);
            }
            mset(total, 0);
            for (int i = 1; i <= n; i ++) {
                for (int j = 0; j < Y[i].first.size(); j ++) {
                    int id = ID[Y[i].first[j]];
                    total[id] += Y[i].second[j] * a[i];
                }
            }
            ll M = 1, ans = 1;
            ll Mod = 2 * mod - 2;
            for (int i = 0; i < prime.size(); i ++) {
                M = M * ((total[i] + 1) % Mod) % Mod;
            }
            for (int i = 0; i < prime.size(); i ++) {
                ans = ans * powermod(prime[i], M * (total[i] % Mod) % Mod / 2, mod) % mod;
            }
            cout << ans << endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    字符串转换日期,日期转换字符串
    List中的Map
    一维数组
    流程控制的基本语法和应用
    《代码阅读方法与实践》读书笔记1
    专业实训题目需求分析
    2015年秋季个人阅读计划
    《人件集 人性化的软件开发》阅读笔记03
    《人件集 人性化的软件开发》阅读笔记02
    《人件集 人性化的软件开发》阅读笔记01
  • 原文地址:https://www.cnblogs.com/jklongint/p/4926441.html
Copyright © 2011-2022 走看看