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;
}
给你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;
}
相关文章推荐
- CodeForces 630 H. Benches(组合数学)
- Codeforces 711D Directed Roads - 组合数学
- Codeforces 559C Gerald and Giant Chess(组合数学+DP)
- CodeForces - 630F Selection of Personnel (组合数学)
- codeforces 785 D Anton and School - 2(组合数学)
- CodeForces 630 I. Parking Lot(组合数学)
- CodeForces - 630G Challenge Pennants (组合数学)
- Codeforces Round #419 (Div. 2) (Codeforces 815B) D. Karen and Test 组合数学
- Codeforces 666C C. Codeword 组合数学+DP
- CodeForces 785D Anton and School - 2 组合数学
- codeforces 156C Cipher 组合数学 字符串dp
- Codeforces 932 E. Team Work(组合数学)
- CodeForces 520E. Pluses everywhere 字符串,组合数学
- CodeForces 364 A.Matrix(组合数学)
- codeforces 554C Kyoya and Colored Balls 【组合数学+费马小定理】
- Codeforces 15E Triangles - 组合数学
- 【CodeForces】115D Unambiguous Arithmetic Expression 组合数学
- codeforces 630H (组合数学)
- Codeforces 785D Anton and School - 2 组合数学
- CodeForces 785D Anton and School - 2 (组合数学)