4338: BJOI2015 糖果

Time Limit: 2 Sec  Memory Limit: 256 MB
Submit: 200  Solved: 93
[Submit][Status][Discuss]

Description

Alice 正在教她的弟弟 Bob 学数学。 
每天,Alice 画一个N行M 列的表格,要求 Bob在格子里填数。 
Bob已经学会了自然数1到K的写法。因此他在每个格子里填1 ~ K之间的整数。 
Alice 告诉 Bob,如果 Bob 填写完表格的 N*M 个数以后,每行的数从第 1 列到第 M
列单调不减,并且任意两行至少有一列的数不同,而且以前 Bob 没有填写过相同的表格,
那么Alice 就给Bob吃一颗糖果。 
Bob想知道,如果每天填写一遍表格,最多能吃到多少颗糖果。 
答案模P输出。 

Input

第一行,四个整数依次是N, M, K, P。 

Output

输出一行,一个整数,表示答案模P 后的结果。 

Sample Input

【样例输入1】
1 3 3 10
【样例输入2】
2 2 2 10

Sample Output

【样例输出1】
0
【样例输出2】
6

HINT

【样例解释】 
样例1。表格只有一行。每个格子可以填写1 ~ 3。有10种填写方法,依次为1 1 1,
1 1 2,1 1 3,1 2 2,1 2 3,1 3 3,2 2 2,2 2 3,2 3 3,3 3 3。   
样例2。表格有两行。有6 种填写方法,依次为  1 1/1 2, 1 1/2 2, 1 2/1 1, 1 2/2 
2, 2 2/1 1, 2 2/1 2。 
 
【数据规模与约定】 
100% 的数据中,1 ≤ N, M ≤ 10^5,1 ≤ P, K ≤ 2*10^9. 
 
没错,这又是扩展卢卡斯+中国剩余定理,是不是已经被我做烂了233333
很容易发现的是一行的方案是可重组合,C(K+M-1,M);
然后因为有N行,行之间不能相同,所以是排列,P(C(K+M-1,M),N)
 
求一下这个就行了。。。。
 
然后会发现的是,P可能是一个大质数或者含有一个大质数,所以我特判了一下,如果P中含有大于M的次数为1的质因子的话,那么就直接用组合数的某一行递推公式来算C;否则就用扩展卢卡斯。
至于算P方法都是一样的2333
 
还有我为什么成了这个题的rank1了,,,(害怕
 
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
int N,M,K,P,MOD;
int d[15],D[15];
int mo,phi[15];
int ans[15],num;
int jc[maxn],inv[maxn]; inline int add(int x,int y,const int ha){
x+=y;
if(x>=ha) return x-ha;
else return x;
} inline int ksm(int x,int y,const int ha){
int an=1;
for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
return an;
} struct node{
int val,tmp;
node operator *(const node &U)const{
return (node){val*(ll)U.val%D[mo],tmp+U.tmp};
}
node operator /(const node &U)const{
return (node){val*(ll)ksm(U.val,phi[mo]-1,D[mo])%D[mo],tmp-U.tmp};
}
}; inline void dvd(){
for(int i=2;i*(ll)i<=P;i++) if(!(P%i)){
d[++num]=i,D[num]=1;
while(!(P%i)) P/=i,D[num]*=i;
phi[num]=D[num]/d[num]*(d[num]-1); if(P==1) break;
} if(P!=1) d[++num]=D[num]=P,phi[num]=P-1;
} inline node getjc(int x){
node now=(node){1,0};
if(x>=d[mo]) now=now*getjc(x/d[mo]),now.tmp+=x/d[mo];
if(x>=D[mo]) now=now*(node){ksm(jc[D[mo]-1],x/D[mo],D[mo]),0};
now=now*(node){jc[x%D[mo]],0}; return now;
} inline node getC(int x,int y){
return getjc(x)/getjc(y)/getjc(x-y);
} inline int getP(int x,int y,const int ha){
int now=x;
for(int i=2;i<=y;i++){
now=add(now,ha-1,ha);
x=x*(ll)now%ha;
}
return x;
} inline void solve(int x){
mo=x,jc[0]=1;
const int ha=D[x];
if(d[x]==D[x]&&d[x]>M){
inv[1]=1;
for(int i=2;i<=M;i++) inv[i]=-inv[ha%i]*(ll)(ha/i)%ha+ha; ans[x]=1;
int now=K+M-1;
for(int i=1;i<=M;i++,now=add(now,ha-1,ha)) ans[x]=ans[x]*(ll)now%ha*(ll)inv[i]%ha; ans[x]=getP(ans[x],N,ha);
}
else{
for(int i=1;i<ha;i++){
jc[i]=jc[i-1];
if(i%d[x]) jc[i]=jc[i]*(ll)i%ha;
} node now=getC(K+M-1,M);
ans[x]=now.val*(ll)ksm(d[x],now.tmp,ha)%ha; ans[x]=getP(ans[x],N,ha);
}
} inline int CRT(){
int an=0;
for(int i=1;i<=num;i++){
mo=i;
an=add(an,(MOD/D[i])*(ll)ksm(MOD/D[i],phi[i]-1,D[i])%MOD*(ll)ans[i]%MOD,MOD);
}
return an;
} int main(){
scanf("%d%d%d%d",&N,&M,&K,&P),MOD=P;
dvd();
for(int i=1;i<=num;i++) solve(i);
printf("%d\n",CRT());
return 0;
}

  

bzoj 4338: BJOI2015 糖果的更多相关文章

  1. [BZOJ 1045] [HAOI2008] 糖果传递

    题目链接:BZOJ 1045 Attention:数据范围中 n <= 10^5 ,实际数据范围比这要大,将数组开到 10^6 就没有问题了. 我们先来看一下下面的这个问题. 若 n 个人坐成一 ...

  2. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  3. BZOJ 4337: BJOI2015 树的同构 树hash

    4337: BJOI2015 树的同构 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4337 Description 树是一种很常见的数 ...

  4. BZOJ 1045: [HAOI2008] 糖果传递 数学

    1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐 ...

  5. bzoj 3052: [wc2013]糖果公园 带修改莫队

    3052: [wc2013]糖果公园 Time Limit: 250 Sec  Memory Limit: 512 MBSubmit: 506  Solved: 189[Submit][Status] ...

  6. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  7. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】

    题目链接:BZOJ - 3052 题目分析 这道题就是非常经典的树上莫队了,并且是带修改的莫队. 带修改的莫队:将询问按照 左端点所在的块编号为第一关键字,右端点所在的块为第二关键字,位于第几次修改之 ...

  8. bzoj 2330 [SCOI2011]糖果(差分约束系统)

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3574  Solved: 1077[Submit][Status ...

  9. BZOJ 2330: [SCOI2011]糖果( 差分约束 )

    坑爹...要求最小值要转成最长路来做.... 小于关系要转化一下 , A < B -> A <= B - 1 ------------------------------------ ...

随机推荐

  1. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  2. 1094 The Largest Generation (25 分)(树的遍历)

    求结点最多的一层 输出该层的结点个数以及层号 #include<bits/stdc++.h> using namespace std; vector<]; map<int,in ...

  3. 第六章 系统配置:DHCP和自动配置

    系统配置:DHCP和自动配置 写在开头:今天和导师见了个面,抛给我一堆材料以及论文,感觉自己学业更加繁重.有些知识现阶段我可能没办法掌握,但是至少在我需要进一步理解它的时候,要知道在哪个地方能够找到. ...

  4. jquery.color.js

    经过测试,可以使用. 2016-12-22  21:39:45 /*! * jQuery Color Animations v2.1.2 * https://github.com/jquery/jqu ...

  5. jQuery中Ajax的属性设置

    1.全局设置为同步 $.ajaxSetup({ async: false });

  6. 【bzoj5055】膜法师 离散化+树状数组

    题目描述 给定一个序列$a$,求满足$i<j<k$且$a_i<a_j<a_k$的三元组$(i,j,k)$的个数. 输入 第一行1个数 n 第二行n个数 a_i 输出 一个数,表 ...

  7. MPSVPX 配置

    MPSVPX 配置 设置主机名,IP地址,掩码,网关,DNS服务器,时区(使用WebGUI界面设置). bash-2.05b# cat svm.conf arp -d -a route flush i ...

  8. [洛谷P3321][SDOI2015]序列统计

    题目大意:给你一个集合$n,m,x,S(S_i\in(0,m],m\leqslant 8000,m\in \rm{prime},n\leqslant10^9)$,求一个长度为$n$的序列$Q$,满足$ ...

  9. 【CZY选讲·Triangle】

    题目描述 长度为的铁丝,你可以将其分成若干段,并把每段都折成一个三角形.你还需要保证三角形的边长都是正整数并且三角形两两相似,问有多少种不同的分法. 数据范围 1≤≤10^6 题解:      ①相 ...

  10. 用hibernate.properties代替hibernate.cfg.xml配置常用的属性

    我们使用hibernate时经常在hibernate.cfg.xml文件中配置数据库连接的相关属性,是否显示sql语句,数据库的方言等,这些配置其实也可以在.properties文件中配置.现在我把这 ...