清北学堂模拟day6 花
【问题描述】
商店里出售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
/*
鲁卡斯定理的适用条件:p为质数(sth原话:p为任意数我也不会求),因为逆元不能直接算,所以必须要分析组合数性质,这个题其实也可作为取模组合数的模板题
分析组合数的公式,首先确定这个数一定是一个整数,也就是说我们只需要分子分母各自分解质因数,然后把分子中出现在分母中的质因数对应减掉其出现次数就行了,暴力分解会稍微慢一点,我们用nlogn的筛法解决,一个数倍一个质数筛掉,分解成两个因子,然后这两个因子继续分解质因数
两篇文章
①http://blog.csdn.net/acdreamers/article/details/8220787
②http://blog.csdn.net/acdreamers/article/details/8037918
*/
#include <cstdio>
#include <cmath> int cnt[],n,m,i,j,r,v[],d[];
long long p,ans; int main()
{
freopen("flower.in", "r", stdin);
freopen("flower.out", "w", stdout);
scanf("%d%d%I64d", &n, &m, &p);
for (i=m+; i<=n; ++i) cnt[i] = ;
for (i=; i<=n-m; ++i) cnt[i] -= ; for (i=; i<=n; ++i)
if (!v[i])
{
for (j=i+i; j<=n; j+=i)
{
v[j] = ;
d[j] = i;
}
}
for (i=n; i>=; --i)
if (d[i] > )
{
cnt[d[i]] += cnt[i];
cnt[i/d[i]] += cnt[i];
cnt[i] = ;
}
ans = ;
for (i=; i<=n; ++i)
for (j=; j<=cnt[i]; ++j) ans = ans*i%p;
printf("%I64d\n", ans);
return ;
}
清北学堂模拟day6 花的更多相关文章
- 清北学堂模拟day6 兔子
[问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...
- 清北学堂模拟day6 圆桌游戏
[问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d1t3 听音乐(music)
题目描述 LYK喜欢听音乐,总共有n首音乐,有m个时刻,每个时刻LYK会听其中一首音乐,第i个时刻会听第ai首音乐.它给自己定了一个规定,就是从听音乐开始,听的每连续n首音乐都是互不相同的.例如当n= ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟day4 捡金币
[问题描述]小空正在玩一个叫做捡金币的游戏.游戏在一个被划分成 n行 n列的网格状场地中进行.每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化. 小空的任务就是在网格中移动,拾取尽量多的 ...
随机推荐
- (原)Java初始化过程
先看一个demo,然后进行归纳. class X{ static M m=new M(); Y y=new Y(); public X(){ System.out.print("X" ...
- MySQL@淘宝 资料分享
MySQL@淘宝 在过去两年, 淘宝数据库团在MySQL.SSD.开源迈出了巨大的步伐,截至11年十月用户数据库库.商品库.交易库都已经稳定的运行在MySQL上,同时也经历的双十一,双十二的考验.这里 ...
- 企业开发中选择logback而不是log4j的理由
不知道看到这篇文章的Java工程师有没有考虑过这个问题:为什么在企业开发中会选择logback来记录日志,而不是log4j呢? 如果你以前没有考虑过这个问题,那么现在如果让你考虑一下,你可能觉的会是因 ...
- Android Studio目录结构浅析
让我们来简单了解下Android Studio中不同目录(文件)的位置和用途.首先看下一个App的最简单的目录结构 OK,我们这么看,第一,把这么多文件先分成这么三块1. 编译系统(Gradle)2. ...
- 数据结构与算法分析 - 网络流入门(Network Flow)
转载:网络流基础篇--Edmond-Karp算法 BY纳米黑客 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出不进,叫做源点. 汇点:另一个点也很特殊, ...
- BZOJ3282: Tree
传送门 又是权限题= =,过了NOIp我就要去当一只权限狗! LCT裸题,get到了两个小姿势. 1.LCA操作应该在access中随时updata 2.Link操作可以更简单 void Link(i ...
- UML图例
概述 常用建模方法:BOOCH.OMT.OOSE等 统一建模语言:UML(Unified Modeling Language) 软件开发过程:RUP(Rational Unified Process) ...
- linux查看java jdk安装路径和设置环境变量
一:查看类型 windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (java执行 ...
- Oracle - 数据库的实例、表空间、用户、表之间关系
完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...
- C++中引用与指针的区别(详细介绍)
C++中引用与指针的区别(详细介绍) C++中的引用与指针的区别 指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一 ...