codeforces 615D - Multipliers

———-codeforces 615D - Multipliers

題意:給定一個2e5範圍內的整數m,之後輸入m個2e5內的素數(當然可以重複了),問把這些輸入的素數全部乘起來所得的數的約數的乘積mod(1e9+7)等於多少?

思路:對題目樣例模擬之後很容易就知道,對於每個素數pi出現的次數m就有pi^(m+1)*m/2,並且對於其他的素數還要在此基礎上乘以前面的d(詳見程序),但是在加入該素數之後對於前面出現的素數的結果也是需要增加的,即ans = pow_mod(ans,vb+1),表示對前面出現的每個素數每加一個素數對前面出現的指數的變化; **裏面對於指數部分,d = d*(vb+1)%(mod-1);之所以%(mod-1)是因爲這裏的d是指數不是結果,對於素數mod;(a^n)%mod = a^(n%(mod - 1))%mod;

<code> 108ms
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000007;
ll d = 1,ans = 1;
map<ll,ll> mp;
ll pow_mod(ll a,ll n)
{
    return n?pow_mod(a*a%mod,n>>1)*(n&1?a:1)%mod:1;
}
int main()
{
    int m,i,p;
    cin>>m;
    for(i=1;i<=m;i++) scanf("%d",&p),mp[p]++;
    for(auto v:mp){
        ll va = v.first,vb = v.second;
    /*pow_mod(ans,vb+1)表示都前面處理過現在的結果,
    *pow_mod(va,(vb+1)*vb/2)表示當前單個v時的結果,
    再來pow_mod(...,d)表示前面處理的對當前的係數影響*/
        ans = pow_mod(ans,vb+1)*pow_mod(pow_mod(va,(vb+1)*vb/2),d)%mod;//並不是ans *= ...
        d = d*(vb+1)%(mod-1);//歐拉函數的性質
    }
    cout<<ans;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章