您的位置:首页 > 其它

CodeForces - 615D Multipliers 组合数学-素因子与因子

2017-11-21 20:37 435 查看
题意:

给你n个素数,有重复,把这n个数乘起来得到 N,然后找到他所有的因子,把这些因子再乘起来,对 1e9+7 取模

思路:

我们可以知道N的所有因子都是由给定的n个素数其中的一些相乘得到,所以我们又可以想到 答案就是n的所有子集相乘取模的结果,但是也难以实现

继续想,可以推出每个素数pi 给N的所有因子的贡献,也就是其中有多少个pi,根据排列组合可以推一下

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 5e5 + 7, maxd = 670000 + 7, mod = 1e9 + 7;
const int INF = 0x7f7f7f7f;

ll pow_(ll a, ll n) {
a %= mod;
ll res = 1;
while(n) {
if(n&1) res = (res*a) % mod;
a = (a*a) % mod;
n /= 2;
}
return res;
}

int main() {

int n;
scanf("%d", &n);
map<int, int> cnt;
for(int i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
cnt[x]++;
}
ll d = 1, ans = 1;
for(auto x : cnt) {
ll cnt = x.second;
ll p = x.first;
ll fp = pow_(p, (cnt+1)*cnt/2);
ans = pow_(ans, (cnt+1)) * pow_(fp, d) % mod;
d = d * (x.second+1)%(mod-1);
}
cout << ans << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: