HIT2813 Garden visiting【组合数】
2015-11-15 17:12
417 查看
题目链接:
http://acm-hit.sunner.cn/judge/show.php?Proid=2813
题目大意:
给你三个整数 N、M、P,求组合数 C(N+M-2,M-1) % P。
解题思路:
将阶乘表示为大整数分解的形式,将各个素因子按素因子的幂相乘起来就是所求
答案(记得要对 P 取余)。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
const int MAXN = 200000;
bool Prime[MAXN+10];
int Primer[MAXN+10];
int GetPrime()
{
for(int i = 2; i <= MAXN; ++i)
Prime[i] = true;
for(int i = 2; i <= MAXN; ++i)
{
if(Prime[i])
for(int j = i+i; j <= MAXN; j+=i)
Prime[j] = false;
}
int num = 0;
for(int i = 2; i <= MAXN; ++i)
if(Prime[i])
Primer[num++] = i;
return num;
}
int PowMod(LL a,LL b,LL mo)
{
LL ret = 1;
while(b)
{
if(b & 1)
ret = ret * a % mo;
a = a * a % mo;
b >>= 1;
}
return ret;
}
int Cal(int n,int p)
{
int sum = 0;
while(n)
{
n /= p;
sum += n;
}
return sum;
}
int main()
{
int T,N,M,Mod;
int num = GetPrime();
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&M,&Mod);
N += M-2;
M--;
LL ans = 1;
for(int i = 0; i < num && Primer[i] <= N; ++i)
{
int temp = Cal(N,Primer[i]) - Cal(M,Primer[i]) - Cal(N-M,Primer[i]);
ans = ans * PowMod(Primer[i],temp,Mod) % Mod;
}
printf("%lld\n",ans);
}
return 0;
}
http://acm-hit.sunner.cn/judge/show.php?Proid=2813
题目大意:
给你三个整数 N、M、P,求组合数 C(N+M-2,M-1) % P。
解题思路:
将阶乘表示为大整数分解的形式,将各个素因子按素因子的幂相乘起来就是所求
答案(记得要对 P 取余)。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;
const int MAXN = 200000;
bool Prime[MAXN+10];
int Primer[MAXN+10];
int GetPrime()
{
for(int i = 2; i <= MAXN; ++i)
Prime[i] = true;
for(int i = 2; i <= MAXN; ++i)
{
if(Prime[i])
for(int j = i+i; j <= MAXN; j+=i)
Prime[j] = false;
}
int num = 0;
for(int i = 2; i <= MAXN; ++i)
if(Prime[i])
Primer[num++] = i;
return num;
}
int PowMod(LL a,LL b,LL mo)
{
LL ret = 1;
while(b)
{
if(b & 1)
ret = ret * a % mo;
a = a * a % mo;
b >>= 1;
}
return ret;
}
int Cal(int n,int p)
{
int sum = 0;
while(n)
{
n /= p;
sum += n;
}
return sum;
}
int main()
{
int T,N,M,Mod;
int num = GetPrime();
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&N,&M,&Mod);
N += M-2;
M--;
LL ans = 1;
for(int i = 0; i < num && Primer[i] <= N; ++i)
{
int temp = Cal(N,Primer[i]) - Cal(M,Primer[i]) - Cal(N-M,Primer[i]);
ans = ans * PowMod(Primer[i],temp,Mod) % Mod;
}
printf("%lld\n",ans);
}
return 0;
}
相关文章推荐
- IOS Objective c 异步链接 网上下载内容到本地及SBjson解析
- linux下mysql命令大全
- ubuntu15.04 安装mongodb
- Java NIO -- block server & client
- D. Igor In the Museum(简单DFS)
- 《leetCode》:Median of Two Sorted Arrays
- 第九周--数据结构--稀疏矩阵的三元组表示的实现及应用
- Android listview 优化
- for in 与 一般for 的区别
- Swift调用Objective C的FrameWork
- linux_NTP服务详解
- NSURLSession的学习和使用
- Android开发——Intent中的各种FLAG
- 自定义控件(17)---布局方式组合系统控件,并封装自定义控件思想(自定义CheckBox)
- sleep 函数的使用
- 简明python教程
- 1115
- Ubuntu 安装mysql和简单操作
- 杭电ACM1713——相遇周期
- html 网页文本设计