Codeforces 893E
来源:互联网 发布:centos如何进入命令行 编辑:程序博客网 时间:2024/06/05 08:37
题意:将x 分成y个数的方法,要求y个数相乘等于x;
思路: 将x质因子分解,得到各个素因子的指数cnt,然后将cnt分成y份,利用隔板法,为C(cnt + y - 1,y- 1) == C(cnt + y - 1,cnt);
因为里面可以出现负数, 俩俩出现,所以是C(y,0) + C(y,2) + C(y,4) + …… ==2^(y - 1);
#include<bits/stdc++.h>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define clr(x,y) memset(x,y,sizeof x)const ll Mod = 1e9 + 7;const int maxn = 2e6 + 10;ll fac[maxn];void Init(){ fac[0] = 1; for(int i = 1;i < maxn;i ++) fac[i] = fac[i - 1] * i % Mod;}ll pows(ll x,ll n){ ll ret = 1; while(n) { if(n & 1)ret = ret * x % Mod; x = x *x % Mod; n >>= 1; } return ret;}ll C(int n,int m){ if(m == 0 || n == m)return 1; if(m * 2 > n)m = n - m; return fac[n] * pows(fac[n - m],Mod - 2) % Mod * pows(fac[m],Mod - 2) % Mod;}int main(){ Init(); int Tcase;scanf("%d",&Tcase); while(Tcase --) { int n,m;scanf("%d%d",&n,&m); ll ans = pows(2,m - 1); for(int i = 2;i * i <= n;i ++) { if(n % i == 0) { int cnt = 0; while(n % i == 0) { cnt ++;n /= i; }// cout << i << " " << cnt << endl; ans = ans * C(m + cnt - 1,cnt) % Mod; } } if(n > 1)ans = ans * m % Mod; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- Codeforces 893E
- Codeforces 893E
- Codeforces 893E 数论
- [Codeforces 893E. Counting Arrays]排列组合
- codeforces 893E Counting Arrays (组合数学)
- codeforces 163E e-Government
- 【Codeforces 163E】E-Government
- Codeforces 78E Evacuation
- 【dp】codeforces 83E
- Codeforces 124 E
- Codeforces 231E
- Codeforces 231E - Cactus
- Codeforces #163 Div2 E
- codeForces 35E
- Codeforces 35E
- Playlist codeforces 268E
- Codeforces 148E(Porcelain)
- codeforces round#177 E
- zookeeper使用(三)--Curator客户端操作zookeeper
- Java并发原理
- sizeof与strlen的区别
- activiti在启动的时候报空指针
- C#中的多线程-线程同步基础 (控制线程数量)
- Codeforces 893E
- Halcon读取jpg格式图片失败的处理方法
- 轻松解决不同关键字序列构成的二叉排序树ASL(平均查找长度)(成功)不同问题
- unity ios 打包设置
- 北京联通ADSL路由ZXV10 H108B V2.0 破解,可自动拨号及通过Wifi联网
- 二叉树的遍历
- 使用Jedis操作Redis
- 数据结构与算法的应用场景
- python面向对象编程学习