您的位置:首页 > 其它

CF 396A On Number of Decompositions into Multipliers

2014-03-01 21:22 239 查看
已经做过了。这次用组合数写。前面的是杨辉三角求组合数。后面的是快速幂求组合数。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
#define LL long long
#define INF 1000000007
#define N 1000
int p[32000];
int r[100000];
int v[5000];
int ptr;
int n,a
;
void prime(){
memset(r, 0, sizeof(r));
ptr = 0;
for(int i = 2; i < 32000; i++){
if(r[i] == 0)p[ptr ++] = i;
for(int j = 0; j < ptr; j++){
if(i * p[j] < 32000)r[i * p[j]] = 1;
}
}
}
LL c[20005][1000];//第一维是下标,第二维上标
int main(){
c[0][0] = 1;
for(int i = 1; i < 15000; i++){
for(int j = 0; j <= min(i, 800); j++){
if(j == 0 || j == i)c[i][j] = 1;
else c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % INF;
}
}
prime();
scanf("%d", &n);
memset(v, 0, sizeof(v));
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
int ul = sqrt(a[i]);
int j;
for(j = 0; p[j] <= ul && j < ptr && a[i] != 1; j ++){
if(a[i] % p[j] == 0){
a[i] /= p[j];
v[j] ++;
j --;
}
}
if(a[i] > 1){
for(;j < ptr;j++){
if(a[i] == p[j]){v[j]++;a[i] = 1;break;}
}
if(a[i] > 1){p[ptr] = a[i];v[ptr] = 1;ptr++;}
}
}
LL ans = 1;
for(int i = 0; i < ptr; i++){
ans *= c[v[i] + n - 1][n - 1];
ans %= INF;
}
printf("%I64d\n", ans);
return 0;
}
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
#define LL long long
#define INF 1000000007
#define N 1000
#define M 1000005
int fac[M],inv[M];
int p[32000];
int r[100000];
int v[5000];
int ptr;
int n,a
;
void prime(){
memset(r, 0, sizeof(r));
ptr = 0;
for(int i = 2; i < 32000; i++){
if(r[i] == 0)p[ptr ++] = i;
for(int j = 0; j < ptr; j++){
if(i * p[j] < 32000)r[i * p[j]] = 1;
}
}
}
int mut(int a, int b){
return 1LL * a * b % INF;
}
int powmod(int a, int b){
int ret = 1;
while(b){
if(b & 1)ret = mut(a, ret);
a = mut(a, a);
b >>= 1;
}
return ret;
}
int zuhe(int df, int uf){
return mut(fac[df], mut(inv[uf], inv[df - uf]));//分别求幂再乘积
}
int main(){
fac[0] = inv[0] = 1;
for(int i = 1; i < M; i++){
fac[i] = mut(i, fac[i - 1]);
inv[i] = powmod(fac[i], INF - 2);
}
prime();
scanf("%d", &n);
memset(v, 0, sizeof(v));
for(int i = 0; i < n; i++){
scanf("%d", &a[i]);
int ul = sqrt(a[i]);
int j;
for(j = 0; p[j] <= ul && j < ptr && a[i] != 1; j ++){
if(a[i] % p[j] == 0){
a[i] /= p[j];
v[j] ++;
j --;
}
}
if(a[i] > 1){
for(;j < ptr;j++){
if(a[i] == p[j]){v[j]++;a[i] = 1;break;}
}
if(a[i] > 1){p[ptr] = a[i];v[ptr] = 1;ptr++;}
}
}
int ans = 1;
for(int i = 0; i < ptr; i++){
int df = v[i] + n - 1;
int uf = n - 1;
ans = mut(ans, zuhe(df, uf));
}
printf("%d\n", ans);
return 0;
}






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