bzoj 2142 国家集训队试题 礼物
问题转化成求C(N,M) mod P p为非素数,那么我们可以将P分解质因数,
也就是 π pi^ci的形式,因为这些pi^ci是互质的,所以我们可以用crt将他们合并
那么问题就转化成了快速求C(N,M) mod pi^ci
那么我们看下c的形式,为N!/(M!(N-M)!) mod pi^ci
因为mod的数不是质数,所以分母没法正常求逆元,那么我们可以将分子分母
中的pi的值挑出,那么我们先求N!,可以发现,N!mod pi^ci可以分段,每段是
pi^ci长,这一段的值是0--(pi^ci-1),那么因为我们需要将N!中pi|I的挑出来
剩下一些数,那就是好几段这个数相乘,用快速幂解决就行了,设cnt为p!其中
不包括pi|n的
那么N! mod pi^ci就变成了cnt^x*pi^y,那么x,y我们可以求出来,然后div掉p
之后,就又出现了一个阶乘,那么递归去做就行了。
比如N=11 pi=2 ci=2
N!为1*2*3*4*5*6*7*8*9*10*11
那么就是[1*3]*[5*7]*[9*11] mod pi^ci
挑出来的数是2,4,6,8,10,都div pi之后是
1,2,3,4,5 然后就成一个子问题了。
/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/
//By BLADEVIL
var
m, n :longint;
pj, c :array[..] of longint;
pi, s, a :array[..] of int64;
p :int64;
tot :longint;
procedure divide(p:int64);
var
i, j :longint;
begin
tot:=;
for i:= to trunc(sqrt(p)) do
if p mod i= then
begin
inc(tot);
pj[tot]:=i;
while p mod i= do
begin
inc(c[tot]);
p:=p div i;
end;
end;
if p> then
begin
inc(tot);
pj[tot]:=p;
c[tot]:=;
end;
for i:= to tot do
begin
pi[i]:=;
for j:= to c[i] do pi[i]:=pi[i]*pj[i];
end;
end;
function ex_gcd(a,b:int64;var x,y:int64):int64;
var
t :int64;
begin
if (b=) then
begin
x:=;y:=;
exit(a);
end;
ex_gcd:=ex_gcd(b,a mod b,x,y);
t:=x;
x:=y;
y:=t-(a div b)*y;
end;
function gcd(a,p:int64):int64;
var
x, y :int64;
begin
x:=;y:=;
ex_gcd(a,p,x,y);
x:=(x mod p+p)mod p;
exit(x);
end;
function mi(x,y,q:int64):int64;
var
rec :int64;
begin
rec:=;
while (y>) do
begin
if y and = then rec:=rec*x mod q;
x:=x*x mod q;
y:=y shr ;
end;
exit(rec);
end;
function fac(n,p,q:int64):int64;
var
cnt :int64;
i :longint;
begin
cnt:=;
for i:= to n do
if (i mod p>) then
cnt:=cnt*i mod q;
exit(cnt);
end;
function fact(n:int64;var sum:int64;p,q:int64):int64;
var
cnt, rec :int64;
begin
rec:=;
cnt:=fac(q,p,q);
while n>=p do
begin
sum:=sum+n div p;
if (n div q>) then rec:=rec*(mi(cnt,n div q,q) mod q)mod q;
if (n mod q>) then rec:=rec*(fac(n mod q,p,q)mod q) mod q;
n:=n div p;
end;
if n> then rec:=rec*fac(n,p,q) mod q;
exit(rec);
end;
function combine(n,m,p,q:int64):int64;
var
ans1, ans2, ans3, ans :int64;
a, b, c :int64;
begin
a:=;b:=;c:=;
ans1:=fact(n,a,p,q);
ans2:=fact(m,b,p,q);
ans3:=fact(n-m,c,p,q);
a:=a-(b+c);
ans:=mi(p,a,q);
ans:=ans*ans1 mod q;
ans:=ans*gcd(ans2,q) mod q;
ans:=ans*gcd(ans3,q) mod q;
exit(ans);
end;
function doit(n,m:longint):int64;
var
i :longint;
x, y, sum :int64;
begin
sum:=;
for i:= to tot do
a[i]:=combine(n,m,pj[i],pi[i]);
for i:= to tot do
begin
x:=;y:=;
ex_gcd(s[i],pi[i],x,y);
x:=(x mod pi[i]+pi[i])mod pi[i];
sum:=(sum+((x*s[i] mod p)*a[i])mod p)mod p;
end;
exit(sum mod p);
end;
procedure main;
var
i :longint;
w :array[..] of longint;
ans :int64;
sum :int64;
begin
readln(p);
divide(p);
for i:= to tot do s[i]:=p div pi[i];
readln(n,m);
sum:=;
for i:= to m do
begin
readln(w[i]);
inc(sum,w[i]);
end;
if sum>n then
begin
writeln('Impossible');
exit;
end;
ans:=;
for i:= to m do
begin
ans:=ans*doit(n,w[i]) mod p;
n:=n-w[i];
end;
writeln(ans);
end;
begin
main;
end.
bzoj 2142 国家集训队试题 礼物的更多相关文章
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)
BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...
- BZOJ 2631 [国家集训队]Tree II (LCT)
题目大意:给你一棵树,让你维护一个数据结构,支持 边的断,连 树链上所有点点权加上某个值 树链上所有点点权乘上某个值 求树链所有点点权和 (辣鸡bzoj又是土豪题,洛谷P1501传送门) LCT裸题, ...
- 洛谷 P1505 BZOJ 2157 [国家集训队]旅游
bzoj题面 Time limit 10000 ms Memory limit 265216 kB OS Linux 吐槽 又浪费一个下午--区间乘-1之后,最大值和最小值更新有坑.新的最大值是原来最 ...
- Bzoj 2038---[2009国家集训队]小Z的袜子(hose) 莫队算法
题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=2038 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色 ...
- Bzoj2034 2009国家集训队试题 最大收益 贪心+各种优化+二分图
这个题真的是太神了... 从一開始枚举到最后n方的转化,各种优化基本都用到了极致.... FQW的题解写了好多,个人感觉我全然没有在这里废话的必要了 直接看这里 各种方法真的是应有尽有 大概说下 首先 ...
- Luogu P1852 BZOJ 2144 [国家集训队]跳跳棋
qwq 这题一看就不会,如果不是gg让做我是坚决不会做的 画图模拟,因为一次只能跳过一个棋子,所以对于一种情况只有三种移动方式: 中间向左跳 中间向右跳 左或右(距中间近的那个)向中间跳 发现,除了跳 ...
- BZOJ.2134.[国家集训队]单选错位(概率 递推)
题目链接 如题目中的公式,我们只要把做对每个题的概率加起来就可以了(乘个1就是期望). 做对第i道题的概率 \[P_i=\frac{1}{max(a_{i-1},a_i)}\] 原式是 \(P_i=\ ...
- Luogu2183【国家集训队】礼物
题面 题解 易得答案为 $$ \sum_{i=1}^m\binom{n-\sum_{j=1}^{i-1}w_j}{\sum_{j=1}^iw_j} $$ 扩展$\text{Lucas}$即可 代码 # ...
随机推荐
- Qt Qwdget 汽车仪表知识点拆解6 自定义控件
先贴上效果图,注意,没有写逻辑,都是乱动的 这里说一下控件自定义 图中标出的部分都是自定义的控件 这里如果我们有批量类似的功能,就可以使用自定义控件的方式,这里我已下面的自定义控件说一下,上面的在上一 ...
- Linux-Qt Quick学习1-Hello world
Qt作为共平台的开发IDE.实在是强大,在Quick的学习中,与平台无关,我这里使用ubuntu和openSUSE,之所以不用Windows,是因为我想借这个机会过学习一点linux的东西,哪怕是熟悉 ...
- fiddler抓包-简单易操作(二)
Fiddler抓包简介 原理:fiddler是通过改写HTTP代理,客户端和服务器进行交互时,数据会从他那里通过,来监控和截取数据.我是这样理解的,如果不对,欢迎指正.如下图: 如果想要抓到数据包,首 ...
- LeetCode 707 ——设计链表
1. 题目 2. 解答 用一个单链表来实现,只有一个头指针.因为不能建立哨兵结点,因此要特别注意是否在头结点处操作. class MyLinkedList { public: struct ListN ...
- 从零开始搭建一个react项目
Nav logo 120 发现 关注 消息 4 搜索 从零开始搭建一个react项目 96 瘦人假噜噜 2017.04.23 23:29* 字数 6330 阅读 32892评论 31喜欢 36 项目地 ...
- JQuery Ajax执行过程AOP拦截
JQuery Ajax过程AOP:用于在Ajax请求发送过程中执行必备操作,比如加载数据访问令牌. $.ajaxSetup({ type: "POST", error: funct ...
- DFS(6)——hdu1342Lotto
一.题目回顾 题目链接:Lotto Sample Input 7 1 2 3 4 5 6 7 8 1 2 3 5 8 13 21 34 0 Sample Output 1 2 3 4 5 6 1 2 ...
- [译]10个有关SCP的命令
原文来源: https://www.tecmint.com/scp-commands-examples/ 基本语法 scp source_file_name username@destination_ ...
- oracle server端字符集修改
1.oracle server端字符集查询 复制代码代码如下: select userenv('language') from dual; server字符集修改: 将数据库启动到RESTRICTED ...
- Python中运算符"=="和"is"的差别分析
前言 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识).python type()(数据类型)和value(值).is和==都是对对象进行比 ...