LGP2461题解
引用化学老师的一句话:什么矩阵,没有矩阵!
这种板子题怎么能用矩阵呢。
\(O(k^2\log n)\) 能搞定何必需要 \(O(k^3\log n)\) 呢。
首先设 \(F_n(x)=x^n \bmod {1-P(x)}\),那么我们需要求 \(\sum_{i=1}^n F_i(x) \bmod (1-P(x))\)。然后卷上 \(B(x)\) 就可以得到需要的东西了。
注意到这是等比数列求和,可以使用分治计算等比数列,可以保证复杂度是 \(O(k^2\log n)\) 而不是 \(O(k^2\log^2n)\) 的。
主要到我们在求的实际上是 \(\sum_{i=1}^n (F_i(x) \bmod {P(x)})\),但是因为这些东西加起来再取模和取模之后再加起来的结果是一样的,所以并无区别。
坑还是比较多的,需要注意一下。
#include<cstdio>
typedef unsigned ui;
typedef __uint128_t L;
typedef unsigned long long ull;
const ui M=55;
ui len,P,b[M],p[M];ull n,m;
struct Barrett{
ull b,m;
Barrett(const ull&m=1):m(m),b((L(1)<<64)/m){}
friend inline ull operator%(const ull&a,const Barrett&mod){
ull r=a-mod.m*(L(mod.b)*a>>64);return r>=mod.m?r-mod.m:r;
}
}mod;
inline void add(ui*f,ui*g,const ui&len){
ui i;for(i=0;i^len;++i)f[i]=(f[i]+g[i])%mod;
}
inline void times(ui*f,ui*g,ui*P,const ui&len){
ui i,j,t,x;static ui sav[M];
for(i=0;i^len;++i)if(f[i])for(j=0;j^len;++j)if(g[j])sav[i+j]=(sav[i+j]+1ull*f[i]*g[j])%mod;
for(i=(len<<1)-1;i>=len;--i)if(sav[i])for(t=sav[i],j=len;j<=len;--j)sav[i-j]=(sav[i-j]+1ull*t*P[j])%mod;
for(i=0;i^len;++i)f[i]=sav[i],sav[i]=0;
}
inline ui Solve(ui*b,ui*P,const ui&len,ull n){
if(n>>63)return 0;ui i,ans(0);static ui f[M],g[M],sav[M];sav[0]=g[0]=1;if(len^1)f[1]=1;else f[0]=p[1];
for(;n;n>>=1,++f[0],times(g,f,P,len),--f[0],times(f,f,P,len))if(n&1)times(sav,f,P,len),add(sav,g,len);
for(i=0;i^len;++i)ans=(ans+1ull*sav[i]*b[i+1])%mod,f[i]=g[i]=sav[i]=0;return ans;
}
signed main(){
ui i;scanf("%u",&len);for(i=1;i<=len;++i)scanf("%u",b+i);for(i=1;i<=len;++i)scanf("%u",p+i);
scanf("%llu%llu%u",&n,&m,&P);mod=Barrett(P);p[0]=P-1;for(i=1;i<=len;++i)b[i]=b[i]%mod,p[i]=p[i]%mod;
printf("%u",(Solve(b,p,len,m-1)+P-Solve(b,p,len,n-2))%mod);
}
upd:这道题可以使用新算法。
我们观察得到,答案为 \([x^n]\frac {B(x)(1-C(x))} {(1-C(x))(1-x)}\)。
然后跑一遍老算法,但是需要求逆。
然而注意到分母的零次项一定为 \(1\),所以实际上并不需要求逆。
常数比老算法小一点儿,仍然不清楚最优解是什么。。。
#include<cstdio>
typedef unsigned ui;
typedef __uint128_t L;
typedef unsigned long long ull;
const ui M=55;
ui len,P,f[M],g[M],b[M],p[M];ull n,m;
struct Barrett{
ull b,m;
Barrett(const ui&m=1):m(m),b((L(1)<<64)/m){}
friend inline ull operator%(const ull&a,const Barrett&mod){
ull r=a-mod.m*(L(mod.b)*a>>64);return r>=mod.m?r-mod.m:r;
}
}mod;
inline void times(ui*f,ui*g,const ui&len){
ui i,j,t;static ui sav[M];
for(i=0;i^len;++i)if(f[i])for(j=0;j^len;++j)if(g[j])sav[i+j]=(sav[i+j]+1ull*f[i]*g[j])%mod;
for(i=0;i<len*2;++i)f[i]=sav[i],sav[i]=0;
}
inline ui Solve(ui*f,ui*g,const ui&len,ull n){
ui i;static ui sav[M];
for(;n;n>>=1){
for(i=0;i<len;++i)sav[i]=i&1?P-g[i]:g[i];times(f,sav,len);times(g,sav,len);
for(i=n&1;i<len*2;i+=2)f[i>>1]=f[i];for(i=0;i<len*2;i+=2)g[i>>1]=g[i];for(i=len;i<len*2;++i)f[i]=g[i]=0;
}
return f[0];
}
signed main(){
ui i,x,y;scanf("%u",&len);++len;for(i=1;i^len;++i)scanf("%u",b+i);for(i=1;i^len;++i)scanf("%u",p+i);
scanf("%llu%llu%u",&n,&m,&P);mod=Barrett(P);p[0]=1;for(i=1;i^len;++i)b[i]=b[i]%mod,p[i]=P-p[i]%mod;
times(b,p,len);b[len++]=0;for(i=len-1;i;--i)p[i]=(p[i]+P-p[i-1])%mod;
for(i=0;i^len;++i)f[i]=b[i],g[i]=p[i];x=Solve(f,g,len,n-1);
for(i=0;i^len;++i)f[i]=b[i],g[i]=p[i];y=Solve(f,g,len,m);
printf("%u",(P+y-x)%mod);
}
LGP2461题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- 深入分析Java中的关键字static
在平时开发当中,我们经常会遇见static关键字.这篇文章就把java中static关键字的使用方法的原理进行一个深入的分析.先给出这篇文章的大致脉络: 首先,描述了static关键字去修饰java类 ...
- Redis常用数据类型以及操作
Redis常用数据类型以及操作 目录 Redis常用数据类型以及操作 一.String数据类型 1. SET/GET/APPEND/STRLEN 2. INCR/DECR/INCRBY/DECRBY ...
- EPF:一种基于进化、协议感知和覆盖率引导的网络协议模糊测试框架
本文系原创,转载请说明出处:from 信安科研人 目录 实验 工具的安装 1.安装AFL++ 2.安装epf 对IEC104协议库进行fuzz 实验准备 使用AFL++中的编译器插桩 开始fuzz 原 ...
- python基础语法_python中的布尔类型详解
转自:http://www.cnblogs.com/521yywzyzhc/p/6264885.html 我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是 ...
- MySQL时间格式TIMESTAMP和DATETIME的区别
时区,timestamp会跟随设置的时区变化而变化,而datetime保存的是绝对值不会变化 自动更新,insert.update数据时,可以设置timestamp列自动以当前时间(CURRENT_T ...
- Solution -「CF 923F」Public Service
\(\mathscr{Description}\) Link. 给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...
- Solution -「多校联训」种蘑菇
\(\mathcal{Description}\) Link. 给定一棵含有 \(n\) 个结点的树,设 \(S\) 为其中的非空联通子集,求 \[\sum_{S}(\gcd_{u\in S} ...
- GoJS 使用笔记
作为商业软件,GoJs很容易使用,文档也很完备,不过项目中没有时间系统地按照文档学习,总是希望快速入门使用,所以将项目中遇到的问题精简一下,希望对后来者有些帮助. 开始使用 这里先展示一个最简单的例子 ...
- Linux 内存分析工具的命令大全介绍
在Linux系统经常被用作服务器系统.当服务器内存吃紧的时候,free命令是我们最常使用的内存分析工具. free使用介绍# free命令可以显示Linux系统中空闲的.已用的物理内存及swap内存, ...
- 前端防抖,double click 克星
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...