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

要写高精,还要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. k8s 各种网络方案【转】

    网络模型有了,如何实现呢? 为了保证网络方案的标准化.扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范. CNI 是由 Core ...

  2. vux 中 this.$vux.loading undefined 的问题

    时间:2018-04-03 摘要:this.$vux.loading 报 undefined 今天在使用 事件触发 vux 的 loading  组件时,发现无法触发成功,显示 undefined 然 ...

  3. 解决win10创建Django工程,运行django-admin.py startproject 工程名,失败的问题

          在看我这篇教程的前提是你应该已经正确装好python和Django了,好了,废话不说了,正题走你!你现在是不是很纠结自己运行django-admin.py startproject 工程名 ...

  4. linux 域名

    Linux 安装好后,其默认的主机名是 localhost.   1.修改 /etc/sysconfig/network  配置文件 vi  /etc/sysconfig/network 修改HOST ...

  5. LOJ #10002. 喷水装置

    题目 裸的贪心. 基本思想见图: Code: #include<iostream> #include<cstdio> #include<cstring> #incl ...

  6. Day4 - H - Following Orders POJ - 1270

    Order is an important concept in mathematics and in computer science. For example, Zorn's Lemma stat ...

  7. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

  8. Oracle delete 之后恢复数据

    当我们粗心大意直接delete from不加条件而又没有回滚的时候有一个很简单的方法能够将数据恢复到delete之前的状态 第一种方案已经帮助我解决了实际问题.第二种方案暂未实践 在此记录下以便日后查 ...

  9. 《ES6标准入门》(阮一峰)--6.正则的扩展

    1.RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new Re ...

  10. PATH环境 变量

    PATH环境 变量 $HOME/.bash_profile和/etc/profile 两个文件在登陆用户的时候会执行, /etc/profile 所有用户都执行,$HOME/.bash_profile ...