生成函数板子题......

要写高精,还要NTT优化......异常dl


这个并不难想啊......

一次召唤会涉及到\(10\)个因素,全部写出来,然后乘起来就得到了答案的生成函数,输出\(n\)次项的系数就好了。

下面把\(10\)个条件列一下

\[1 + x^6 + x^{12} + \cdots = \frac{1}{1-x^6}
\]

\[1+x^2+x^3+\cdots+x^9 = \frac{1-x^{10}}{1-x}
\]

\[1+x^2+x^3+x^4+x^5 = \frac{1-x^6}{1-x}
\]

\[1+x^4+x^8+\cdots = \frac{1}{1-x^4}
\]

\[1+x^2+x^3+\cdots+x^7 = \frac{1-x^8}{1-x}
\]

\[1+x^2+x^4+\cdots = \frac{1}{1-x^2}
\]

\[1+x = \frac{1-x^2}{1-x}
\]

\[1+x^8+x^{16}+\cdots = \frac{1}{1-x^8}
\]

\[1+x^{10}+x^{20}+\cdots = \frac{1}{1-x^{10}}
\]

\[1+x^2+x^3 = \frac{1-x^4}{1-x}
\]

全部乘起来,然后消掉一些分子分母,就是\(\frac{1}{(1-x)^5} = (-x+1)^{-5}\),假设\(|x|<1\)好了,然后二项式定理

\[(-x+1)^{-5} = \sum\limits_{k=0}^{\infty} (-1)^{k} \frac{(-5)(-5-1)\cdots(-5-k+1)}{k!} x^k = \sum\limits_{i=0}^{\infty} \binom{k+4}{k} x^k
\]

所以答案就是\(\binom{n+4}{n} = \frac{(n+1)(n+2)(n+3)(n+4)}{24}\)

然而要写高精......还要NTT啥的优化一下......

好像其他语言都被卡了......

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N=6e5+10,P=998244353,gen=3,igen=(P+1)/gen;
inline int add(int x,int y){
return x+y>=P?x+y-P:x+y;
}
inline int sub(int x,int y){
return x-y<0?x-y+P:x-y;
}
inline int fpow(int x,int y){
int ret=1; for(;y;y>>=1,x=1ll*x*x%P)
if(y&1) ret=1ll*ret*x%P;
return ret;
}
int rev[N];
void init(int n){
for(int i=0;i<n;i++) rev[i]=rev[i>>1]>>1|((i&1)?n>>1:0);
}
void ntt(int *f,int n,int flg){
for(int i=0;i<n;i++)
if(rev[i]<i) swap(f[i],f[rev[i]]);
for(int k=1,len=2;len<=n;len<<=1,k<<=1){
int wn=fpow(flg==1?gen:igen,(P-1)/len);
for(int i=0;i<n;i+=len)
for(int w=1,j=i;j<i+k;j++,w=1ll*w*wn%P){
int tmp=1ll*w*f[j+k]%P;
f[j+k]=sub(f[j],tmp),f[j]=add(f[j],tmp);
}
}
if(flg==-1){
int inv=fpow(n,P-2);
for(int i=0;i<n;i++) f[i]=1ll*f[i]*inv%P;
}
}
struct BigInt{
static const int bas=100,basl=2;
int a[N],len;
int &operator [] (int k1){return a[k1];}
BigInt(char *s){
len=strlen(s); reverse(s,s+len);
for(int i=0;i<len;i++) s[i]-=48;
for(int i=0;i<len;i+=basl)
a[i>>1]=s[i]+s[i+1]*10;
maintain();
}
BigInt(){memset(a,0,sizeof(a));len=0;}
void maintain(){
while(len&&!a[len-1])len--;
while(a[len])a[len]+=a[len-1]/bas,a[len-1]%=bas,len++;
}
void mdf(){
a[0]++; for(int i=0;i<len;i++) a[i+1]+=a[i]/bas,a[i]%=bas;
maintain();
}
BigInt operator * (BigInt &k1){
int n=len,m=k1.len; int limit=1;while(limit<=n+m-1)limit<<=1; init(limit);
static int A[N],B[N];
for(int i=0;i<limit;i++) A[i]=a[i],B[i]=k1[i];
ntt(A,limit,1),ntt(B,limit,1);
BigInt ans; ans.len=n+m;
for(int i=0;i<limit;i++) ans[i]=1ll*A[i]*B[i]%P;
ntt(ans.a,limit,-1);
for(int i=0;i<ans.len;i++) ans[i+1]+=ans[i]/bas,ans[i]%=bas;
ans.maintain();
return ans;
}
BigInt operator /= (int q){
int r=0;
for(int i=len-1;i>=0;i--){
int nw=r*100+a[i];
a[i]=nw/q; r=nw%q;
}
maintain();
return *this;
}
void print(){
printf("%d",a[len-1]);
for(int i=len-2;i>=0;i--) printf("%.02d",a[i]);
}
}a[5],ans;
char s[1000010];
int main(){
scanf("%s",s); a[1]=s;
a[1].mdf();for(int i=2;i<=4;i++) a[i]=a[i-1],a[i].mdf();
ans=a[1]*a[2]*a[3]*a[4];
ans/=24;
ans.print();
return 0;
}

[题解] Luogu P2000 拯救世界的更多相关文章

  1. luogu P2000 拯救世界

    嘟嘟嘟 题目有点坑,要你求的多少大阵指的是召唤kkk的大阵数 * lzn的大阵数,不是相加. 看到这个限制条件,显然要用生成函数推一推. 比如第一个条件"金神石的块数必须是6的倍数" ...

  2. luogu P2000 拯救世界 生成函数_麦克劳林展开_python

    模板题. 将所有的多项式按等比数列求和公式将生成函数压缩,相乘后麦克劳林展开即可. Code: n=int(input()) print((n+1)*(n+2)*(n+3)*(n+4)//24)

  3. 【洛谷】P2000 拯救世界

    题解 小迪的blog : https://www.cnblogs.com/RabbitHu/p/9178645.html 请大家点推荐并在sigongzi的评论下面点支持谢谢! 掌握了小迪生成函数的有 ...

  4. 洛谷P2000 拯救世界(生成函数)

    题面 题目链接 Sol 生成函数入门题 至多为\(k\)就是\(\frac{1-x^{k+1}}{1-x}\) \(k\)的倍数就是\(\frac{1}{1-x^k}\) 化简完了就只剩下一个\(\f ...

  5. Luogu 2000 拯救世界

    从胡小兔的博客那里过来的,简单记一下生成函数. 生成函数 数列$\{1, 1, 1, 1, \cdots\}$的生成函数是$f(x) = 1 + x + x^2 + x^3 + \cdots$,根据等 ...

  6. [洛谷P2000 拯救世界]

    生成函数版题. 考虑对于这些条件写出\(OGF\) \(1 + x^6 + x^{12} + x^{18}..... = \frac{1}{1 - x^6}\) \(1 + x + x ^ 2 + x ...

  7. [题解] Luogu P5446 [THUPC2018]绿绿和串串

    [题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...

  8. 题解 Luogu P2499: [SDOI2012]象棋

    关于这道题, 我们可以发现移动顺序不会改变答案, 具体来说, 我们有以下引理成立: 对于一个移动过程中的任意一个移动, 若其到达的位置上有一个棋子, 则该方案要么不能将所有棋子移动到最终位置, 要么可 ...

  9. 题解 luogu P1144 【最短路计数】

    本蒟蒻也来发一次题解第一篇请见谅 这个题有几个要点 1.无向无权图,建图的时候别忘记建来回的有向边[因此WA掉1次 2.无权嘛,那么边长建成1就好了2333333 3.最短路采用迪杰斯特拉(别忘用堆优 ...

随机推荐

  1. DEDE后台升级后不显示编辑器

    dede5.7不显示编辑器不能编辑文章的解决办法:进入系统后台系统配置-系统基本参数-核心设置将fck换成ckeditor保存,当然需要fck编辑器也可以到dede官网下载.dede5.7不显示编辑器 ...

  2. php hash算法实现memcached分布式

    一.概述Memcached和mysql一样,是一款客户端/服务器端(C/S)系统管理软件,有IP.端口,一旦启动,服务器就一直处于可用状态.Mysql是通过SQL语句管理“磁盘中”的文件,Memcac ...

  3. 201705 Ruby基础拾遗

    Mixin override 异常处理 super 与super() 使用%()处理需要string interpolation但同时也需要" "(double quote)的状况 ...

  4. windows清理命令

    总是有一些设备需要清理,第三方的软件有不可以安装,那么,就需要这两条命令来做: cleanmgr /sageset:99 #设置要被清理的东西 cleanmgr /sagerun:99 #执行清理操作 ...

  5. Day6 - M - 动态逆序对 HYSBZ - 3295

    对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删 除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数 I ...

  6. JAVA CookieUtil

    package com.itheima.shop.utils; import java.io.UnsupportedEncodingException; import java.net.URLDeco ...

  7. JSONObject 和JSONArray基本使用

    1. 打包 JSONObject jsonObject = new JSONObject(); jsonObject.put("code", "200"); j ...

  8. Linux每日练习-批量删除用户,非脚本运行方式 20200225

  9. 英语学习 - 进行时态的被动 ( be being done )

    be being done  例: The story book was being read by him .

  10. 指令——cat

    作用1:cat有直接打开一个文件的功能,只看不用编辑. 语法:#cat 文件的路径 选项:-n, --number 对输出的所有行编号. 如:用cat查看/etc/passwd [root@local ...