题目分析:

用数论分块的思想,就会发现其实就是连续一段的长度$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. 方法重载与invokevirtual字节码指令的关系

    1.方法重载 创建MyTest5类 public class MyTest5 { public void test(Grandpa grandpa){ System.out.println(" ...

  2. Class as decorator in python

    Class as decorator in python . https://www.geeksforgeeks.org/class-as-decorator-in-python/ http://co ...

  3. JS数组常见方法的深浅拷贝分类

    一.涉及浅拷贝类方法,会改变原数组 1,pop():   删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值.如果数组已经为空,则 pop() 不 改变数组,并返 ...

  4. vue 自己编写向左滑动的动画 仿transition

    vue 模板代码: <div class="content-wrap clearfix" :class="{slideIn: showIn, slideOut: s ...

  5. FineReport 交叉报表

    交叉报表 - FineReport报表官网http://www.finereport.com/knowledge/professional/crossreport.html FineReport--- ...

  6. SynchronizedStack -- tomcat8同步栈

    同步栈(安全栈): org.apache.tomcat.util.collections.SynchronizedStack通过stack栈锁来控制栈中获取的类T.通过push.pop和clear方法 ...

  7. 十、collection的作用+变量

    一.collection作用?容器 组织业务逻辑 导入导出 其他功能,比如监控和mock server 二.为什么要使用变量 假设我们需要测试n个api,这些api的domain都是相同的,比如 ap ...

  8. Selenium踩坑记之iFrame的定位与切换

    转自:https://www.jianshu.com/p/6e7d0359e4bb Selenium是浏览器自动化测试的工具之一,用过的人都懂他的好,也被他坑的不要不要的.今天就聊聊Selenium的 ...

  9. Python3基础 keyword 查看所有的关键字

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. 阿里重磅开源在线分析诊断工具Arthas(阿尔萨斯)

    github地址: Arthas English version goes here. Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱. 当你遇到以下类似问题而束手无策时,Art ...