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 < ...
随机推荐
- Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression
Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression 2019-05-20 19:3 ...
- Looper: Looper,Handler,MessageQueue三者之间的联系
在Android中每个应用的UI线程是被保护的,不能在UI线程中进行耗时的操作,其他的子线程也不能直接进行UI操作.为了达到这个目的Android设计了handler Looper这个系统框架,And ...
- 表单在ios下输入框必须重压或长按才能唤起软键盘
解决方案: 一.在node_module里找到fastClick文件,然后找到focus方法,加一句focus方法即可解决:FastClick.prototype.focus = function(t ...
- 关于xadmin的网址收集
https://blog.csdn.net/yambo1992/article/details/80918250 https://www.colabug.com/4728510.html django ...
- Python3基础 str : 对字符串进行切片
Python : 3.7.3 OS : Ubuntu 18.04.2 LTS IDE : pycharm-community-2019.1.3 ...
- nginx通过robots.txt禁止所有蜘蛛访问(禁止搜索引擎收录)
在server {} 块中添加下面的配置 location =/robots.txt { default_type text/html; add_header Content-Type "t ...
- 教孩子学编程 Python
教孩子学编程 Python 目录 第1 章 Python 基础:认识环境 111 认识Python 312 用Python 编写程序 513 运行Python 程序 514 本章小结 615 编程 ...
- 【Leetcode_easy】944. Delete Columns to Make Sorted
problem 944. Delete Columns to Make Sorted 题意:其实题意很简单,但是题目的description给整糊涂啦...直接看题目标题即可理解. solution: ...
- shell脚本通过子网掩码计算出掩码位数
子网掩码格式为255.255.255.0可以通过以下脚本计算掩码位数 #!/bin/sh #maskdigits.sh mask maskdigits () { a=$(echo "$1&q ...
- 通过iis启动服务,会产生C:/inetpub/logs/logsFile产生大量的日志,定期清理
[转]https://www.cnblogs.com/Martianhh/p/5312495.html bat文件内容如下,加入到计划任务执行 :: 清理IIS日志文件 :: 备份MySql数据库 @ ...