清北学堂 day6 花
1.花
( flower.cpp/c/pas)
【 问题描述】
商店里出售 n 种不同品种的花。为了装饰桌面,你打算买 m 支花回家。你觉得放两支一
样的花很难看,因此每种品种的花最多买 1 支。求总共有几种不同的买花的方案? 答案可能
很大,输出答案 mod p 的值。
【 输入格式】
一行 3 个整数 n, m, p, 意义如题所述。
【 输出格式】
一个整数,表示买花的方案数。
【输入输出样例 1】
| flower.in | flower.out |
| 4 2 5 | 1 |
见选手目录下的 flower / flower1.in 与 flower / flower1.out
【输入输出样例 1 说明】
用数字 1,2,3,4 来表示花的种类的话,4 种花里买各不相同的 2 支的方案有(1,2)、(1,3)、
(1,4)、 (2,3)、 (2,4)、 (3,4), 共 6 种方案, 模 5 后余数是 1。
【输入输出样例 2】
见选手目录下的 flower / flower2.in 与 flower / flower2.out
【 数据范围】
对于 30%的数据, n,m≤10
对于 50%的数据, n,m≤1000
对于 80%的数据, 1≤m≤n≤50,000
对于 100%的数据, 1≤m≤n≤1,000,000, p≤1,000,000,000
解:100分:运用组合数公式:C(n,m)=n!/(m!*(n-m)!)
因为范围较大,所以进行质因数分解以约分,先打出质数表,最后直接寻找剩余质数并进行乘法取模即可;(必要时可使用快速幂与快速加)。
开 long #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define man 1000010
#define sc(x) scanf("%lld",&x)
#define mem(x) memset(x,0,sizeof(x))
#define ll long long
using namespace std;
ll used[man],prime[man],tot=,aa=;
bool isp[man];
int n,m,p;
inline void mkp(int x)
{
for(int i=;i<=x;i++)
{
if(!isp[i])
{ prime[++tot]=i;
}
for(int j=;j<=tot&&i*prime[j]<=x;j++)
{
isp[i*prime[j]]=;
if(i%prime[j]==)
break;
}
}
}
void calc1(int x)//n
{
int ans=x;
for(int i=;i<=tot;i++)
{
if(ans%prime[i]==)
{
int t=;
while(ans%prime[i]==)
{
ans=ans/prime[i];
t++;
}
used[prime[i]]+=t;
}
if(!isp[ans])
{ used[ans]++;
ans=;
}
if(ans==)
break;
}
}
void calc2(int x)//m&(n-m)
{
int ans=x;
for(int i=;i<=tot;i++)
{
if(ans%prime[i]==)
{
int t=;
while(ans%prime[i]==)
{
ans=ans/prime[i];
t++;
}
used[prime[i]]-=t;
}
if(!isp[ans])
{ used[ans]--;
break;
}
if(ans==)
break;
}
}
ll badd(ll a,ll b,ll c)//快速加
{
ll ans=,bas=a;
while(b)
{
if(b&) ans=(ans+bas)%p;
bas=(bas+bas)%p;
b>>=;
}
return ans;
}
ll bpow(ll a,ll b,ll c)//快速幂
{
int ans=,bas=a;
while(b)
{
if(b&) ans=(ans*(bas%p))%p;
bas=((bas%p)*(bas%p))%p;
b>>=;
}
return ans;
}
int main()
{ freopen("flower.in","r",stdin);
freopen("flower.out","w",stdout);
mem(prime);mem(used);mem(isp);
sc(n);sc(m);sc(p);
mkp(n);
for(int i=;i<=n;i++)//对n!质因数分解
calc1(i);
for(int i=;i<=m;i++)//对m!质因数分解
calc2(i);
for(int i=;i<=n-m;i++)//对(n-m)!质因数分解
calc2(i);
for(int i=;i<=tot;i++)
{
if(used[prime[i]]>)
{
aa=badd(aa,bpow(prime[i],used[prime[i]],p),p);
}
}
printf("%lld\n",aa);
return ;
}
清北学堂 day6 花的更多相关文章
- 清北学堂 day6 兔子
---恢复内容开始--- [问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与 ...
- 清北学堂2017NOIP冬令营入学测试P4745 B’s problem(b)
清北学堂2017NOIP冬令营入学测试 P4745 B's problem(b) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 题目描 ...
- 清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)
清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算 ...
- 济南清北学堂游记 Day 1.
快住手!这根本不是暴力! 刷了一整天的题就是了..上午三道题的画风还算挺正常,估计是第一天,给点水题做做算了.. rqy大佬AK了上午的比赛! 当时我t2暴力写挂,还以为需要用啥奇怪的算法,后来发现, ...
- 清明培训 清北学堂 DAY1
今天是李昊老师的讲授~~ 总结了一下今天的内容: 1.高精度算法 (1) 高精度加法 思路:模拟竖式运算 注意:进位 优化:压位 程序代码: #include<iostream>#in ...
- 7月清北学堂培训 Day 3
今天是丁明朔老师的讲授~ 数据结构 绪论 下面是天天见的: 栈,队列: 堆: 并查集: 树状数组: 线段树: 平衡树: 下面是不常见的: 主席树: 树链剖分: 树套树: 下面是清北学堂课程表里的: S ...
- 清北学堂模拟day6 花
[问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
- 清北学堂模拟day6 兔子
[问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...
- 清北学堂模拟day6 圆桌游戏
[问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...
随机推荐
- springmvc之获取参数
1.导包,四大核心包,一个切面包(AOP),logging,web,springmvc 2.配置文件,核心代码如下: web.xml <servlet> <servlet-name& ...
- ASP.NET Redis 开发 入门
ASP.NET Redis 开发 文件并发(日志处理)--队列--Redis+Log4Net Redis简介 Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据 ...
- python高手的自修课
python高手的自修课 作者:相国大人 目录 0.第0课:前言与参考文献 目标读者: 具有一定python基础的编程爱好者. 本系列博文为了尽可能少说废话,凡是能够用代码表达的,都尽量直接用代码.读 ...
- ECMAScript有6种继承方式(实现继承)
本人对于ECMAScript继承机制有些见解,如果说的不对,敬请赐教~~~~ 继承是OO语言(面向对象)挺好的概念,许多OO语言都支持两种继承方式(接口只继承方法签名.实际继承则继承实际的方法),但是 ...
- Linux Platform devices 平台设备驱动
设备总线驱动模型:http://blog.csdn.net/lizuobin2/article/details/51570196 本文主要参考:http://www.wowotech.net/devi ...
- 【洛谷】P2694 接金币(排序)
题目描述 在二维坐标系里,有N个金币,编号0至N-1.初始时,第i个金币的坐标是(Xi,Yi).所有的金币每秒向下垂直下降一个单位高度,例如有个金币当前坐标是(xf, yf),那么t秒后金币所在的位置 ...
- Windows下安装GCC
1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...
- 遇到版本兼容问题时 Newtonsoft.Json
<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <depen ...
- 第九章 消息总线: Spring Cloud Bus
在微服务架构的系统中, 我们通常会使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来, 由于该主题中产生的消息会被所有实例监听和消费, 所以我们称它为消息总线. 在总线上的各 ...
- App压力测试背景
开展压力测试 原因: 提高产品的稳定性 提高产品的留存率 时间: 首轮功能测试通过 夜间进行(将工具设置后进行,节约资源) 如何开展: 确定事件流 模拟事件流