题目分析:

用数论分块的思想,就会发现其实就是连续一段的长度$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]泳池 【多项式取模】【递推】【矩阵快速幂】的更多相关文章

  1. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. hdu 2604 递推 矩阵快速幂

    HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...

  3. HDU - 6185 Covering(暴搜+递推+矩阵快速幂)

    Covering Bob's school has a big playground, boys and girls always play games here after school. To p ...

  4. CodeChef-----February Challenge 2018---Broken Clock(极坐标+三角函数递推+矩阵快速幂)

    链接:  https://www.codechef.com/FEB18/problems/BROCLK Broken Clock Problem Code: BROCLK Chef has a clo ...

  5. HDU 2842 (递推+矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...

  6. [hdu 2604] Queuing 递推 矩阵快速幂

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  7. 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] 类似于斐波那契数列的递推式子吧, 但 ...

  8. HDU6030 Happy Necklace(递推+矩阵快速幂)

    传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...

  9. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  10. LightOJ 1244 - Tiles 猜递推+矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...

随机推荐

  1. Unity编辑器环境在Inspector面板中显示变量

    Serialize功能Unity3D 中提供了非常方便的功能可以帮助用户将 成员变量 在Inspector中显示,并且定义Serialize关系. 简单的说,在没有自定义Inspector的情况下所有 ...

  2. AXURE RP8 - 实战手册 网站和APP原型制作案例精粹

    扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主    

  3. phpexcel 导出xsl乱码

    在header前面加上 ob_end_clean(); ob_end_clean();//清除缓冲区,避免乱码 header('Content-Type: application/vnd.ms-exc ...

  4. C++main函数命令行选项——学习笔记

    atoi字符串的数转化为整数 atof转化为小数

  5. ISO/IEC 9899:2011 条款6.5.6——加法操作符

    6.5.6 加法操作符 语法 1.additive-expression: multiplication-expression additive-expression    +    multipli ...

  6. 一台服务器部署多台tomcat

    如题,多个项目部署在一台服务器.减少容错性,觉得分开部署,这样一个tomcat挂了不会影响另一个项目.看配置和应用大小决定数量,一般四五个没问题,也有单台服务器部署8个tomcat稳定运行的. 下面记 ...

  7. k8s记录-flanneld+docker网络部署(四)

    1)程序准备tar xvf flannel-v0.10.0-linux-amd64.tar.gz mkdir -p /data/projects/common/kubernetes/{bin,cfg, ...

  8. 【438】Python 处理文件

    1. 读取文件,计算 tweets 数目 python中readline判断文件读取结束的方法 line == '' python:如何检查一行是否为空行 line == '\n' or line = ...

  9. spring 使用XML配置开发Spring AOP

      XML方式开发AOP与注解开发原理是相同的,所以这里主要介绍一些用法即可.这里需要在XML中引入AOP的命名空间,所以先来了解一下AOP可配置的元素 代码清单:切面类 package com.ss ...

  10. /var/spool/postfix

    centos磁盘优化,发现/var/spool/postfix/maildrop下有大量文件. cron进程默认会将计划任务中所运行的脚本的警告.错误信息或者脚本输出信息发送给计划任务的所有者,而由于 ...