LGP5430题解
新的 \(O(k+\log n)\) 做法。
考虑计算每个猴子对答案的贡献。
打个表:
1 1 2 4 8 16 32 ...
可以看出第 $ i $ 个猴子对答案的贡献是 \(i^k \times 2^{n-i-1}\),特别地,最后一只猴子对答案的贡献是 \(n^k\)。
写成柿子:
\]
\]
我们只需要计算出 \(\sum_{i=1}^{n-1}i^k \times (2^{-1})^i\) 即可。
然后我们发现这个柿子是 CODECHEF qpolysum,然后就做完了。
还是把做法写一遍吧
qpolysum 和本题有不同之处,即 \(i\) 从 \(0\) 开始,不过没啥区别,因为你要减掉的是一个 \(0\)(
\]
在本题中相当于 \(m=2^{-1}\)。
不过这个做法是猜了一个很奇怪的结论,并且做法来自校 OJ 讨论区(
我们猜 \(S(n)=m^n G(n) - G(0)\),其中 \(G(x)\) 是一个不超过 \(k\) 次的多项式。
证明可以看这个 blog 我才不告诉你是我看不懂
然后差分一下:
\]
\]
设 \(G(0)=x\),那么我们在 \(n\) 为任何值的时候用 \(x\) 表示 \(G(n)\)。
因为这个多项式的次数最高为 \(k\),而对一个 \(k\) 次多项式差分 \(k+1\) 次后为 \(0\),所以我们把 \(G(x)\) 差分 \(k+1\) 次后得到:
\]
我们可以用 \(x\) 表示 \(G(0) \sim G(k+1)\),然后解一个一元一次方程即可得到 \(x\),带入可得到 \(G(1) \sim G(k+1)\) 的值。
现在我们可以使用拉格朗日插值计算 \(G(n)\) 了,答案就是 \(m^nG(n)-G(0)\)。
\(i^k\) 可以使用线性筛,所以复杂度是 \(O(k+\log n)\)。
什么?你卡我空间?\(10\) 个数组太多了???
实际上可以缩成 \(7\) 个 \(\rm int\) 数组和 \(1\) 个 \(\rm bool\) 数组。
我的线性筛使用的是直接纪录最小质因数而非纪录是否为质数,可以改成后者。
然后就是 \(q\) 和 \(p\) 数组在使用的时候,\(x\) 和 \(y\) 数组已经不会使用了,所以直接使用 \(x\) 和 \(y\) 代替 \(q\) 和 \(p\) 即可。
code:
#include<cstdio>
#include<cctype>
const int M=2e7+5,mod=1e9+7;
int k,n1,n2,top,x[M],y[M],idk[M],pri[M],fac[M],ifac[M];bool zhi[M];
int G[M];
inline void read(){
char s;long long t1,t2;
while(isdigit(s=getchar())){
t1=n1*10ll+(s^48);n1=t1>=mod?t1%mod:t1;
t2=n2*10ll+(s^48);n2=t2>=mod-1?t2%(mod-1):t2;
}
}
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
return b>a?a-b+mod:a-b;
}
inline int C(const int&n,const int&m){
return 1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod;
}
inline int pow(int a,int b){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;
return ans;
}
inline void sieve(const int&M){
register int i,j,x;idk[1]=1;
for(i=2;i<=M;++i){
if(!zhi[i])pri[++top]=i,idk[i]=pow(i,k);
for(j=1;j<=top&&(x=i*pri[j])<=M;++j){
idk[x]=1ll*idk[i]*idk[pri[j]]%mod;zhi[x]=true;
if(!(i%pri[j]))break;
}
}
}
inline int Inter(const int&n){
register int i,tmp,ans=0;
x[0]=y[k+2]=1;
for(i=1;i<=k+1;++i)x[i]=1ll*x[i-1]*Del(n,i)%mod;
for(i=k+1;i>=1;--i)y[i]=1ll*y[i+1]*Del(n,i)%mod;
for(i=1;i<=k+1;++i){
if(k+1-i&1)ans=Del(ans,1ll*1ll*x[i-1]*y[i+1]%mod*G[i]%mod*ifac[i-1]%mod*ifac[k+1-i]%mod);
else ans=Add(ans,1ll*1ll*x[i-1]*y[i+1]%mod*G[i]%mod*ifac[i-1]%mod*ifac[k+1-i]%mod);
}
return ans;
}
signed main(){
register int i,X=0,Y=0;
fac[0]=fac[1]=ifac[0]=ifac[1]=1;read();scanf("%d",&k);sieve(k+1);x[0]=1;y[0]=0;
for(i=1;i<=k+1;++i)x[i]=Add(x[i-1],x[i-1]),y[i]=Add(y[i-1],idk[i-1]),y[i]=Add(y[i],y[i]);
for(i=2;i<=k+1;++i)fac[i]=1ll*fac[i-1]*i%mod,ifac[i]=1ll*(mod-mod/i)*ifac[mod%i]%mod;
for(i=2;i<=k+1;++i)ifac[i]=1ll*ifac[i-1]*ifac[i]%mod;
for(i=0;i<=k+1;++i){
if(i&1){
X=Add(X,1ll*C(k+1,i)*x[k+1-i]%mod);
Y=Add(Y,1ll*C(k+1,i)*y[k+1-i]%mod);
}
else{
X=Del(X,1ll*C(k+1,i)*x[k+1-i]%mod);
Y=Del(Y,1ll*C(k+1,i)*y[k+1-i]%mod);
}
}
G[0]=mod-1ll*Y*pow(X,mod-2)%mod;
for(i=1;i<=k+1;++i)G[i]=Add(1ll*x[i]*G[0]%mod,y[i]);
printf("%d",Add(1ll*Del(1ll*pow(500000004,n2)*Inter(n1)%mod,G[0])*pow(2,n2-1)%mod,pow(n1,k)));
}
LGP5430题解的更多相关文章
- 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 & ...
随机推荐
- Handler消息机制的写法
使用Handler的步骤: 1.主线程中创建一个Handler private Handler handler = new Handler(){ ...
- LeetCode随缘刷题之最长回文子串
这一题我用的相对比较笨的方法. 相对于大佬们用的动态规划法,比较复杂.但却更容易理解,我主要是通过记录下标来确定最长回文串的. package leetcode.day_12_06; /** * 给你 ...
- 如何将VSCode配置上传到gitee账户,简单几步教你实现
众所周知,VSCode是一款功能非常强大的代码编写软件,不仅开源免费,其插件商店也是非常广泛.非常之强大.借助这些插件我们可以配置各种语言环境,也可以运行各种代码. 但随之就有问题出现了,我们在更换设 ...
- Elasticsearch按请求体基本查询
1 分页: localhost:9200/get-together/_search {"query": {"match_all": {}},"from ...
- 同事提出个我从未想过的问题,为什么Kubernetes要"多此一举"推出静态Pod概念?
同事提出个我从未想过的问题,为什么Kubernetes要"多此一举"推出静态Pod概念? 我们知道k8s中Pod可以说是一个合格的容器小管家,Pod 被设计成支持多个容器可以一起进 ...
- Windows server 2012安装VM tools异常解决办法
在VMWare虚拟机上安装Windows Server 2012之 后安装VMWare Tools时报如下错误信息: 问题:缺少KB2919355补丁 (先安装KB2919442,在安装KB29193 ...
- 力扣第二题 大数相加 ,链表在python到底该怎么写?
但问题在于链表的表示 如何创建一个L3呢 如何用next将他们连接起来呢? 原来是采用 制作链表的形式 l3_pointer.next = ListNode(l1_pointer.val + l2_ ...
- ASP.NET Core 6框架揭秘实例演示[12]:诊断跟踪的进阶用法
一个好的程序员能够在系统出现问题之后马上定位错误的根源并找到正确的解决方案,一个更好的程序员能够根据当前的运行状态预知未来可能发生的问题,并将问题扼杀在摇篮中.诊断跟踪能够帮助我们有效地纠错和排错&l ...
- 国内外主流5款doshboard软件比较和对比
大数据行业随着互联网的蓬勃发展中也越来越被人们看好,但是从事大数据行业的数据分析师经常会谈到dashboard,很多人就会疑惑什么是dashboard,下面就来了解一下Doshboard的发展. da ...
- 帆软和思迈特软件Smartbi产品的详细对比
一.设计模式上 (1)finereport V10.0需要下载一个600M的设计器,采用类excel的设计模式,打开时间有20S,反复测试几次,基本都在20多秒.(测试电脑core I5 4核8G). ...