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; }
相关文章推荐
- win7系统右键资源管理器崩溃的解决办法
- 经验分享一 自定义ArrayAdapter中的字体
- ACM编程技巧--常用字符操作函数
- 关于笔记本linux亮度调节
- 【uni环境高级编程】2.进程控制笔记
- android Canvas的save和restore(截图)
- Gas Station
- HDU 4004
- myeclipse添加server library
- MutableCopy 与 Copy
- MyEclipse项目里面出现红叉,项目内又没有红叉的解决方案
- 九度oj 题目1015:还是A+B 【ZJU2006考研机试题1】
- The steps for download android source code
- Linux开发网站
- FusionWidgets之AngularGauge图
- FusionWidgets之AngularGauge图
- 软件测试基本概念之一
- activiti工作流引擎(一)why activiti
- JDBC批处理
- vi编辑器问题、ubuntu问题