NOIP模拟34
考试的时候被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的更多相关文章
- noip模拟34[惨败]
noip模拟34 solutions 我从来不为失败找借口,因为败了就是败了,没人听你诉说任何事情 今天很伤感,以来考试没考好,二来改题改半天也改不出来 这次算是炸出来了我经常范的一些错误,比如除以0 ...
- Noip模拟34 2021.8.9
T1 Merchant 一眼二分,然后想了想维护凸包,好像并没有什么关系, 然后又想了想维护一个栈,发现跳指针细节过多不想打 最后直接打了二分,大点跑的飞快,感觉比较稳,出来$78$分 是没用神奇的$ ...
- 2021.8.9考试总结[NOIP模拟34]
T1 Merchant 如果$t=0$时不能达到$s$,那么所拿物品的价值一定关于时间单调递增,答案单调.因此可以特判$0$后二分. 用$sort$复杂度被卡,要用$\textit{nth_eleme ...
- NOIP模拟 34
次芝麻,喝喝喝,长寿花! 什么鬼畜题面...一看就不是什么正经出题人 skyh双双双AK了..太巨了... T1 次芝麻 稍稍手玩就能发现分界点以一个优美的方式跳动 然后就愉快地帮次货们次掉了这个题- ...
- NOIP 模拟 $34\; \rm Rectangle$
题解 \(by\;zj\varphi\) 对于没有在同一行或同一列的情况,直接枚举右边界,左边界从大到小,用树状数组维护上下边界即可. 而对于有多个在一列或一行的情况,这些点将左右分成了几个区间,枚举 ...
- NOIP 模拟 $34\; \rm Equation$
题解 \(by\;zj\varphi\) 发现每个点的权值都可以表示成 \(\rm k\pm x\). 那么对于新增的方程,\(\rm x_u+x_v=k\pm x/0\) 且 \(\rm x_u+x ...
- NOIP 模拟 $34\; \rm Merchant$
题解 \(by\;zj\varphi\) 对于选的物品,总值一定有在前一段区间递减,后一段递增的性质,那么就可以二分. check()时只递归归并大的一段,用nth_element即可 Code #i ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- NOIP模拟17.9.22
NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥
随机推荐
- Java9以后的垃圾回收
1: finalize() 方法 finallize() 方法是Object类的方法, 用于在类被GC回收时 做一些处理操作, 但是JVM并不能保证finalize(0 ) 方法一定被执行, 由于fi ...
- React入门学习
为了获得更好的阅读体验,请访问原地址:传送门 一.React 简介 React 是什么 React 是一个起源于 Facebook 的内部项目,因为当时 Facebook 对于市场上所有的 JavaS ...
- 04-10 Bagging和随机森林
目录 Bagging算法和随机森林 一.Bagging算法和随机森林学习目标 二.Bagging算法原理回顾 三.Bagging算法流程 3.1 输入 3.2 输出 3.3 流程 四.随机森林详解 4 ...
- javascript关键字typeof、instanceof、constructor判断类型
鉴于 ECMAScript 是松散类型的,因此需要有一种手段来检测给定变量的数据类型.对于这个问题,JavaScript 也提供了多种方法,但遗憾的是,不同的方法得到的结果参差不齐. 下面介绍常用的几 ...
- SEER流量众筹模块开发测试网络及使用文档发布
SEER利用区块链奖励机制,可解决传统体育赛事痛点,提高行业运转效率.比如提高赛事方收入,让观众自由选择想看的比赛,给予赛事众筹的参与者贡献影响力,使其获得由智能合约量化的激励等.此功能可广泛应用于包 ...
- POJ 3784 Running Median (模拟水过带翻译)
Description Moscow is hosting a major international conference, which is attended by n scientists fr ...
- django2.0+反向查询抛异常处理
一.错误信息 AttributeError: 'RelatedManager' object has no attribute 'lrc' #其中RelatedManager为关键字 二.反向查询的字 ...
- 关于CSS Grid Layout的代码解释
.wrapper { display: grid; /*生成grid类型块级网格*/ grid-template-columns: repeat(3, 1fr); /*设置显示的列网格线,且重复3次1 ...
- selenium-模块概述(1)
Selenium是一个用于Web应用程序自动化测试工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 1.目录结构如下: D:\soft\python36\Lib\site-pa ...
- 谢宝友: 手把手教你给Linux内核发patch
本文系转载,著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者: 谢宝友 来源: 微信公众号 linux阅码场 (id: linuxdev) 本文简介 本文一步一 ...