Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】
题目分析:
用数论分块的思想,就会发现其实就是连续一段的长度$i$的高度不能超过$\lfloor \frac{k}{i} \rfloor$,然后我们会发现最长的非$0$一段不会超过$k$,所以我们可以弄一个长度为$i$的非$0$段的个数称为"元",然后用
"元"去递推。
这个"元"的求法用DP:令数论分块之后第$i$段的长度为$g[i]$
$$f[i][j] = f[i-1][j] + f[i-1][k]*f[i][j-k-1]*g[i]$$
$$f[1][1] = 1$$
然后接下来就是一个很简单的矩阵快速幂了。
对于$k$很大的情况用多项式取模优化就行了。
代码:
#include<bits/stdc++.h>
using namespace std; const int mod = ; int n,k,x,y;
int maxx[],pos[],cas[],num;
int g[][],f[]; int FF[],ans[],dt[],zeta[]; int fast_pow(int now,int pw){
int ans = ,dt = now,bit = ;
while(bit <= pw){
if(bit & pw) ans = 1ll*ans*dt%mod;
bit<<=; dt = 1ll*dt*dt%mod;
}
return ans;
} void multi(int *A,int *B,int len){
memset(zeta,,sizeof(zeta));
for(int i=;i<len;i++){
for(int j=;j<len;j++) zeta[i+j]+=1ll*A[i]*B[j]%mod,zeta[i+j]%=mod;
}
for(int i=len*;i>=len;i--){
if(zeta[i] == ) continue;
int pp = zeta[i],dr = (FF[len]==?:mod-);
for(int j=i,kk=len;kk>=;kk--,j--){
zeta[j] -= 1ll*pp*FF[kk]%mod*dr%mod;
if(zeta[j] <) zeta[j] += mod;
}
}
for(int i=;i<len;i++) A[i] = zeta[i];
} void fastpow(int len,int pw){
memset(ans,,sizeof(ans)); ans[] = ;
memset(dt,,sizeof(dt)); dt[] = ;
int bit = ;
while(bit<=pw){
if(bit & pw) multi(ans,dt,len);
multi(dt,dt,len); bit<<=;
}
} void getbase(int now){
memset(g,,sizeof(g));
g[][] = ;
for(int i=;i<=num;i++){
g[i][] = ;
for(int j=;j<=now/cas[i];j++){
g[i][j] += g[i-][j]; g[i][j] %= mod;
for(int l=;l<j;l++){
for(int ec = cas[i+]+;ec<=cas[i];ec++){
g[i][j]+=1ll*g[i-][l]%mod*g[i][j-l-]%mod*pos[ec]%mod;
g[i][j] %= mod;
}
}
}
}
} int work(int now){
memset(cas,,sizeof(cas)); memset(maxx,,sizeof(maxx));
memset(f,,sizeof(f));
num = ;
for(int i=;i<=now;i++) {
maxx[i] = now/i;
if(maxx[i] != maxx[i-]) cas[++num] = maxx[i];
}
getbase(now);
f[] = ;
for(int i=;i<=;i++){
for(int j=;j<=now;j++){
if(j > i) break;
if(j == i){f[i] += g[num][i]; f[i] %= mod;}
else{f[i]+=1ll*f[i-j-]*pos[]%mod*g[num][j]%mod;f[i]%=mod;}
}
}
if(n <= ) return f[n];
else{
memset(FF,,sizeof(FF));
FF[now+] = ;
for(int i=;i<=now+;i++)
FF[now+-i]=(mod-1ll*g[num][i-]*pos[]%mod)%mod;
if(!(n&)){for(int i=;i<=now+;i++) FF[i] = (mod-FF[i])%mod;}
fastpow(now+,n);
int res = ;
for(int i=;i<=now;i++){res += 1ll*ans[i]*f[i]%mod; res %= mod;}
return res;
}
} int main(){
scanf("%d%d%d%d",&n,&k,&x,&y);
x = 1ll*x*fast_pow(y,mod-)%mod;
for(int i=;i<=k;i++){pos[i] = 1ll*fast_pow(x,i)*(mod+-x)%mod;}
if(n == ){printf("%d\n",pos[k]);return ;}
int ans = work(k)-work(k-);
if(ans < ) ans += mod;
printf("%d\n",ans);
return ;
}
Luogu3824 [NOI2017]泳池 【多项式取模】【递推】【矩阵快速幂】的更多相关文章
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- HDU - 6185 Covering(暴搜+递推+矩阵快速幂)
Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...
- CodeChef-----February Challenge 2018---Broken Clock(极坐标+三角函数递推+矩阵快速幂)
链接: https://www.codechef.com/FEB18/problems/BROCLK Broken Clock Problem Code: BROCLK Chef has a clo ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- HDU6030 Happy Necklace(递推+矩阵快速幂)
传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...
- 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...
- LightOJ 1244 - Tiles 猜递推+矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...
随机推荐
- pt-table-checksum解读【转】
pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行: mysql>GRANT SELECT, PROCESS, SUPER, ...
- 官方Android Camera2 录像示例--停止录像时崩溃修正
官方Android 使用Camera2示例项目地址:https://github.com/android/camera-samples 视频录像示例:https://github.com/androi ...
- 使用AWS Lambda,API Gateway和S3 Storage快速调整图片大小
https://www.obytes.com/blog/2019/image-resizing-on-the-fly-with-aws-lambda,-api-gateway,-and-s3-stor ...
- Python中__new__和__init__的区别与联系
__new__ 负责对象的创建而 __init__ 负责对象的初始化. __new__:创建对象时调用,会返回当前对象的一个实例 __init__:创建完对象后调用,对当前对象的一些实例初始化,无返回 ...
- openresty开发系列12--lua介绍及常用数据类型简介
openresty开发系列12--lua介绍及常用数据类型简介 lua介绍 1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...
- zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间
zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 之前的博文 使用zabbix3..4的ICMP Ping模版实现对客户端网络状态的监控 https://www.cnblog ...
- WPF分析工具
分析WPF程序是理解其行为很重要的一步,市场上有大量现成的WPF程序分析工具,如Snoop,WPFPerf,Perforator和Visual Profiler,其中Perforator和Visual ...
- realsense 图片与点云数据采集
- Docker容器(四)——常用命令
(1).基本使用方法 查看所有镜像.docker images [root@youxi1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ...
- 基于TreeSoft实现mysql、oracle、sql server的数据同步
一.为了解决数据同步汇聚,数据分发,数据转换,数据维护需求,TreeSoft推出了数据同步,数据处理等丰富功能 . TreeSoft作为中间传输载体负责连接各种数据源,为各种异构数据库之间架起沟通的桥 ...