引用化学老师的一句话:什么矩阵,没有矩阵!

这种板子题怎么能用矩阵呢。

\(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题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. c语言字符串函数详解

    转载请注明来源:https://www.cnblogs.com/hookjc/ oid *memset(void *dest, int c, size_t count); 将dest前面count个字 ...

  2. js实现网页回弹小球效果

    直接上效果图 运行页面会首先弹出一个输入框,询问用户想要产生的小球数量,随后后台就会产生指定数量的小球,在页面中来回跳动,触碰到页面边框时,就会回弹,且产生的小球颜色随机,小球在页面中的位置随机,小球 ...

  3. docker中run和start的区别?

    docker run 后面指定的是一个镜像 而docker start指定的是一个容器 docker run是利用镜像生成容器,并启动容器,而docker start是启动一个之前生成过的容器

  4. P3400【仓鼠窝 】

    思路清奇,代码简洁的好题 问题大体分两部: 记录子矩阵个数,统计每一个点作为右下角时可以得到多少矩形,加起来就是答案 剪掉墙挡住的地方 考虑从右下角开始,如果有0已经挡住了矩阵,那么更靠左.上的0都卵 ...

  5. 私有化轻量级持续集成部署方案--02-Nginx网关服务

    提示:本系列笔记全部存在于 Github, 可以直接在 Github 查看全部笔记 这一篇中使用 Nginx 部署网关中心,用来代理服务器中服务.网关中心有优点也有缺点,也可以不采用网关系统. 部署 ...

  6. MXNet学习:试用卷积-训练CIFAR-10数据集

    第一次用卷积,看的别人的模型跑的CIFAR-10,不过吐槽一下...我觉着我的965m加速之后比我的cpu算起来没快多少..正确率64%的样子,没达到模型里说的75%,不知道问题出在哪里 import ...

  7. Solution -「洛谷 P3911」最小公倍数之和

    \(\mathcal{Description}\)   Link.   给定 \(\{a_n\}\),求: \[\sum_{i=1}^n\sum_{j=1}^n\operatorname{lcm}(a ...

  8. Solution -「HNOI 2007」「洛谷 P3185」分裂游戏

    \(\mathcal{Description}\)   Link.   给定 \(n\) 堆石子,数量为 \(\{a_n\}\),双人博弈,每轮操作选定 \(i<j\le k\),使 \(a_i ...

  9. 已经安装的nginx增加额外配置步骤

    这里以安装第三方ngx_http_google_filter_module模块为例nginx的模块是需要重新编译nginx,而不是像apache一样配置文件引用.so1. 下载第三方扩展模块ngx_h ...

  10. 16进制转字符串得到flag

    工业协议分析2 666c61677b37466f4d3253746b6865507a7d