考试的时候被T2卡了一年。。。。考虑了一下正解的式子,然后没去给左边分解因数,去给后面乘倍数。。。理论复杂度O(n^2),实际好像卡不掉的样子。但是由于我智障的打了一棵主席树,他M了。。。。

预计得分100+??+20,实际得分100+70+20

T3,

  这道题dp式子想一想就出来了,但是由于模数不保证质数,如果用组合数要exlucas,其实可以不用组合数,但是由于我过于智障,还是打了组合数打法,但是由于我不会懒得打ex,于是我们可以。。。。。分解质因数。。。。。

  首先求出1到m每个数的质因子,然后对于组合数分解成质因数相乘的形式,如果每求一个组合数都暴力将所有质因子乘一遍的话,显然会死,考虑优化:

  从当前组合数递推到下一个质组合数只需要乘一个数,再除掉一个数,我们观察到除掉的那个数必然<5000,于是我们可以每次将小于5000的质因子暴力乘一遍,再乘上大于5000的质因子的乘积,那么复杂度就对了。

  注意在求每个数的质因子时,我们不需要每个数O(sqrt(n))求,可以在线筛的同时处理出来,具体来说,i×pri的质因子一定只比i多一个pri,我们可以记录每个数的前趋是谁,这样复杂度O(n),也可以直接让乘积继承i的vector,复杂度和埃氏筛一样,为O(nloglogn),都是可以接受的。

代码比exlucas短,效率也快很多(虽然不如不用组合数)

 #include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m,p,pri[],tot,mx,a[];
vector<int>h[];
char v[];
ll num[][],f[][],c[],aa=,sum[];
inline int read(int x=,char ch=getchar()){
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')x=x*-+ch,ch=getchar();
return x;
}
inline ll qpow(ll x,ll y,ll ans=){
for(;y;y>>=,x=x*x%p)
if(y&)
ans=ans*x%p;
return ans;
}
signed main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=;i<=n;i++) a[i]=read(),mx=max(mx,a[i]);
for(int i=;i<=m;i++){
if(!v[i]) pri[++tot]=i,h[i].push_back(i);
for(int j=;j<=tot&&i*pri[j]<=m;j++){
v[i*pri[j]]=true;
h[i*pri[j]]=h[i];
h[i*pri[j]].push_back(pri[j]);
if(i%pri[j]==) break;
}
}
for(int j=;j<h[m].size();j++){
if(h[m][j]>)aa=aa*h[m][j]%p;
else sum[h[m][j]]++;
}
for(int i=;i<=min(mx,m);i++){
c[i]=aa;
for(int j=;j<=tot&&pri[j]<=;j++)
c[i]=c[i]*qpow(pri[j],sum[pri[j]])%p;
if(i!=min(mx,m)){
for(int j=;j<h[i+].size();j++)
sum[h[i+][j]]--;
for(int j=;j<h[m-i].size();j++)
if(h[m-i][j]>)aa=aa*h[m-i][j]%p;
else sum[h[m-i][j]]++;
}
}
num[][]=;
for(int i=;i<=mx;i++)
for(int j=;j<=min(mx,m);j++)
num[i][j]=(num[i-][j-]*j+num[i-][j]*(j-))%p;
for(int i=;i<=min(a[],m);i++)
f[][i]=num[a[]][i]*c[i]%p,sum[]=(sum[]+f[][i])%p;
for(int i=;i<=n;i++){
sum[i]=;
for(int j=;j<=min(a[i],m);j++){
f[i&][j]=((sum[i-]*num[a[i]][j]%p*c[j]-(j<=a[i-])*f[(i-)&][j]*num[a[i]][j])%p+p)%p;
sum[i]=(sum[i]+f[i&][j])%p;
}
}
printf("%lld\n",sum[n]);
return ;
}

NOIP模拟34的更多相关文章

  1. noip模拟34[惨败]

    noip模拟34 solutions 我从来不为失败找借口,因为败了就是败了,没人听你诉说任何事情 今天很伤感,以来考试没考好,二来改题改半天也改不出来 这次算是炸出来了我经常范的一些错误,比如除以0 ...

  2. Noip模拟34 2021.8.9

    T1 Merchant 一眼二分,然后想了想维护凸包,好像并没有什么关系, 然后又想了想维护一个栈,发现跳指针细节过多不想打 最后直接打了二分,大点跑的飞快,感觉比较稳,出来$78$分 是没用神奇的$ ...

  3. 2021.8.9考试总结[NOIP模拟34]

    T1 Merchant 如果$t=0$时不能达到$s$,那么所拿物品的价值一定关于时间单调递增,答案单调.因此可以特判$0$后二分. 用$sort$复杂度被卡,要用$\textit{nth_eleme ...

  4. NOIP模拟 34

    次芝麻,喝喝喝,长寿花! 什么鬼畜题面...一看就不是什么正经出题人 skyh双双双AK了..太巨了... T1 次芝麻 稍稍手玩就能发现分界点以一个优美的方式跳动 然后就愉快地帮次货们次掉了这个题- ...

  5. NOIP 模拟 $34\; \rm Rectangle$

    题解 \(by\;zj\varphi\) 对于没有在同一行或同一列的情况,直接枚举右边界,左边界从大到小,用树状数组维护上下边界即可. 而对于有多个在一列或一行的情况,这些点将左右分成了几个区间,枚举 ...

  6. NOIP 模拟 $34\; \rm Equation$

    题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...

  7. NOIP 模拟 $34\; \rm Merchant$

    题解 \(by\;zj\varphi\) 对于选的物品,总值一定有在前一段区间递减,后一段递增的性质,那么就可以二分. check()时只递归归并大的一段,用nth_element即可 Code #i ...

  8. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  9. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

随机推荐

  1. Java的一些基础知识深入

    1.浅析Java中的final关键字: 2.Java中的static关键字解析: 3.探秘Java中String.StringBuilder以及StringBuffer: 4.Java内部类详解: 5 ...

  2. 每个新手程序员都必须知道的Python技巧

    当下,Python 比以往的任何时候都更加流行,人们每天都在实践着 Python 是多么的强大且易用. 我从事 Python 编程已经有几年时间了,但是最近6个月才是全职的.下面列举的这些事情,是我最 ...

  3. [动态规划]高数Umaru系列(9)——哈士奇(背包问题)

    高数Umaru系列(9)——哈士奇 http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index/problemdetail/pid/3358.ht ...

  4. mac下的环境变量

    a. /etc/profile b. /etc/paths c. ~/.bash_profile d. ~/.bash_login e. ~/.profile f. ~/.bashrc 其中a和b是系 ...

  5. 什么是回流(重排 reflow)?什么是重绘(repaint)?如何减少回流、重绘?

    什么是回流(重排 reflow)? 回流(重排 reflow):对DOM树进行渲染,只要修改DOM或修改元素的形状大小,就会触发reflow,reflow的时候,浏览器会使已渲染好受到影响的部分失效, ...

  6. PCIE DMA实现

    基于Spartan-6, Virtex-5/Virtex-6/Virtex-7/7 Series FPGA PCI Express Block Endpoint模块设计PCI Express Endp ...

  7. C语言函数名以及取地址的区别和联系

    有时看到如下的代码: /*****************************/ #include <stdio.h> #include <string.h> #inclu ...

  8. 加密解密 之base系列编码

    Base16 Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码.Base16先获取输入字符串每个字节的二进制值(不足8比特在高位补0),然后将其串联进来, ...

  9. JavaScript ES6函数式编程(二):柯里化、偏应用和组合、管道

    上一篇介绍了闭包和高阶函数,这是函数式编程的基础核心.这一篇来看看高阶函数的实战场景. 首先强调两点: 注意闭包的生成位置,清楚作用域链,知道闭包生成后缓存了哪些变量 高阶函数思想:以变量作用域作为根 ...

  10. go-linux环境搭建

    下载 go1..linux-amd64.tar.gz 解压: tar zxvf go1..linux-amd64.tar.gz -C /usr/local 配置环境变量:vim  /root/.bas ...