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 < ...
随机推荐
- [设计原则与模式] 面向对象程序设计之五大原则(SOLID)
cp from: https://blog.csdn.net/zhangbuzhangbu/article/details/51719952 S.O.L.I.D是面向对象设计和编程(OOD& ...
- 多层nginx中的压缩问题 api接口>1M数据的返回浏览器 网关
基础 前端异步请求,局部刷新,加大最大等待时间 nginx开启压缩 进阶 多级nginx的压缩 实践测试: 每级都要开启压缩 gizp on: 最外层开启,但最内层没有开启 最外层没有开启 最外层.最 ...
- Ubuntu 1604 安装配置 kafka,并配置开机自启(systemctl)
安装 kafka 需要先安装 jdk.一.下载官网:http://kafka.apache.org/downloads.html 二.安装 安装参考:https://segmentfault.com/ ...
- Spring Boot TImer Schedule Quartz
Spring Boot 2.X(十二):定时任务-云栖社区-阿里云https://yq.aliyun.com/articles/723876?spm=a2c4e.11155472.0.0.2f8b3a ...
- ISO/IEC 9899:2011 条款6.5.8——关系操作符
6.5.8 关系操作符 语法 1.relational-expression: shift-expression relational-expression < shift-expr ...
- Python利用ctypes实现按引用传参
C的代码 void test_cref(char *a, int *b, char *data) { , sizeof(char)); strcpy(p, "cute"); a[] ...
- 使用origin画SCI论文图
使用origin画SCI论文图 觉得有用的话,欢迎一起讨论相互学习~Follow Me start 使用的是OriginPro这款软件,这款软件的特点是 一个字 好 . 新建工作簿并导入数据 可以使用 ...
- 转 mysql 存储过程初探
https://www.cnblogs.com/qmfsun/p/4838032.htmlMySQL命令执行sql文件的两种方法 https://www.cnblogs.com/mark-chan/p ...
- 基于grafana+prometheus构建Flink监控
先上一个架构图 Flink App : 通过report 将数据发出去 Pushgateway : Prometheus 生态中一个重要工具 Prometheus : 一套开源的系统监控报警框架 ...
- java使用ffmpeg生成HLS切片文件
/*** * 将文件切割成片 * @param filename * @param uuid * @param data * @throws IOException */ default void d ...