清北学堂 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号的左边 ...
随机推荐
- Excel if函数无法正确对比大小
我想完成以下操作 1.提取A列数字的第7-11位的数字 2.若此数字大于1993 3.则返回20,不然返回0 于是我在B和C列上写了两个函数,分别是 MID(A1,7,4) IF(B ...
- python学习(二十四) 字符串格式化
1: Test 1 a = 'city' b = 'country' print(" aaa %s bbb %s " % (a, b)) result: aaa city bbb ...
- ALSA声卡11_从零编写之调试——学习笔记
1.调试 (1)把程序拷贝到服务器上进行编译 (2)把程序放到内核上面去 重新配置内核,吧原来的声卡驱动程序去掉 a. 修改语法错误 11th_myalsa b. 配置内核去掉原来的声卡驱动 -> ...
- canvas之画一条线段
var canvas=document.getElementById("canvas"); //设置绘图环境 var cxt=canvas.getContext('2d'); // ...
- 【UVA】1589 Xiangqi(挖坑待填)
题目 题目 分析 无力了,noip考完心力憔悴,想随便切道题却码了250line,而且还是错的,知道自己哪里错了,但特殊情况判起来太烦了,唯一选择是重构,我却没有这勇气. 有空再写吧,最近真的 ...
- 仅用CSS3创建h5预加载雷达圈
<head> <meta charset="UTF-8"> <title></title> <style type=" ...
- Cisco动态路由 OSPF协议
OSPF描述: 组播扩展OSPF 锁定 同义词 ospf一般指组播扩展OSPF 本词条由“科普中国”百科科学词条编写与应用工作项目 审核 . OSPF(Open Shortest Path Firs ...
- Linux 下 实现 锐捷验证的方式
准备工作:下载mentohust并安装 步骤: 1.打开终端,输入sudo mentohust 2.配置相关参数,网卡选第一个,用户名密码自己输入,类型选锐捷私有,DHCP选认证前.完成后回车即可通过 ...
- Python函数部分
Python函数的初识 Python函数的进阶 Python中的闭包与迭代器 Python生成器/推导式/生成器表达式 Python内置函数二 (递归函数,匿名函数,二分法)
- linux进程通信:消息队列
消息队列可以实现两个没有关系的进程之间的通信. 创建了一个消息队列后,进程可以往里面放消息,也可以取消息.因为这个消息队列是有名字的,所以就算是两个没有关系的进程,也能通信. 而且人性化的一点是,可以 ...