题解

小迪的blog : https://www.cnblogs.com/RabbitHu/p/9178645.html

请大家点推荐并在sigongzi的评论下面点支持谢谢!

掌握了小迪生成函数的有趣姿势之后,我们考虑一下这个问题

由于出题人语死早,我们认为是十种石头的生成函数直接乘起来

\(\frac{1}{1 - x^6} \cdot \frac{1 - x^{10}}{1 - x} \cdot \frac{1 - x^{5}}{1 - x} \cdot \frac{1}{1 - x^4} \cdot \frac{1 - x^8}{1 - x} \cdot \frac{1}{1 - x^2} \cdot \frac{1 - x^2}{1 - x} \cdot \frac{1}{1 - x^8} \cdot \frac{1}{1 - x^10} \cdot \frac{1 - x^4}{1 - x} = \frac{1}{(1 - x)^5}\)

这个正好是上面那个blog里和组合数有关的生成函数,所以我们要求的值就是

\(\binom{n + 5 - 1}{5 - 1} = \binom{n + 4}{4} = \frac{(n + 1)(n + 2)(n + 3)(n + 4)}{24}\)

显然需要高精度了,还得是FFT

可以用NTT代替(因为值不会太大)

“我司嘉祺就算是TLE死,死外面,从这里跳下去,也绝对不会开O2的!”

“氧气真好吸。”

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 1000005
//#define ivorysi
#define pb push_back
using namespace std;
typedef long long int64;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
const int MOD = 998244353,MaxL = (1 << 20);
int W[(1 << 20) + 5],N;
char a[1000005];
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
int fpow(int x,int c) {
int res = 1,t = x;
while(c) {
if(c & 1) res = mul(res,t);
t = mul(t,t);
c >>= 1;
}
return res;
}
struct Bignum {
vector<int> v;
friend Bignum operator + (const Bignum &a,const int &x) {
Bignum c;c.v.clear();
int g = (a.v[0] + x) / 10;
c.v.pb((a.v[0] + x) % 10);
for(int i = 1 ; i < a.v.size() ; ++i) {
int t = a.v[i] + g;
c.v.pb(t % 10);g = t / 10;
}
if(g) c.v.pb(g);
return c;
}
friend void NTT(Bignum &f,int LEN,int on) {
f.v.resize(LEN);
for(int i = 1 , j = LEN / 2 ; i < LEN - 1 ; ++i) {
if(i < j) swap(f.v[i],f.v[j]);
int k = LEN / 2;
while(j >= k) {
j -= k;
k >>= 1;
}
j += k;
}
for(int h = 2 ; h <= LEN ; h <<= 1) {
int wn = W[(MaxL + on * MaxL / h) % MaxL];
for(int k = 0 ; k < LEN ; k += h) {
int w = 1;
for(int j = k ; j < k + h / 2 ; ++j) {
int u = f.v[j],t = mul(w,f.v[j + h / 2]);
f.v[j] = inc(u,t);
f.v[j + h / 2] = inc(u,MOD - t);
w = mul(w,wn);
}
}
}
if(on == -1) {
int InvL = fpow(LEN,MOD - 2);
for(int i = 0 ; i < LEN ; ++i) f.v[i] = mul(f.v[i],InvL);
}
}
friend Bignum operator * (Bignum a,Bignum b) {
int s = a.v.size() + b.v.size() - 2,t = 1;
while(t <= s) t <<= 1;
NTT(a,t,1);NTT(b,t,1);
Bignum c;c.v.clear();
for(int i = 0 ; i < t ; ++i) c.v.pb(mul(a.v[i],b.v[i]));
NTT(c,t,-1);
int64 x = 0;
for(int i = 0 ; i < t ; ++i) {
x += c.v[i];
c.v[i] = x % 10;
x /= 10;
}
while(x) {
c.v.pb(x % 10);
x /= 10;
}
for(int i = c.v.size() - 1 ; i > 0 ; --i) {
if(c.v[i] == 0) c.v.pop_back();
else break;
}
return c;
}
friend Bignum operator / (const Bignum &a,int k) {
Bignum c;c.v.clear();c.v.resize(a.v.size());
int x = 0;
for(int i = a.v.size() - 1 ; i >= 0 ; --i) {
x = x * 10 + a.v[i];
c.v[i] = x / k;
x %= k;
}
for(int i = a.v.size() - 1 ; i > 0 ; --i) {
if(c.v[i] == 0) c.v.pop_back();
else break;
}
return c;
}
void print() {
for(int i = v.size() - 1 ; i >= 0 ; --i) {
putchar('0' + v[i]);
}
}
}A,B;
void Solve() {
W[0] = 1;W[1] = fpow(3,(MOD - 1) / (1 << 20));
for(int i = 2 ; i < (1 << 20) ; ++i) W[i] = mul(W[i - 1],W[1]);
scanf("%s",a + 1);
N = strlen(a + 1);
A.v.clear();
for(int i = N ; i >= 1 ; --i) A.v.pb(a[i] - '0');
B = ((A + 1) * (A + 2)) * ((A + 3) * (A + 4));
B = B / 24;
B.print();enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}

【洛谷】P2000 拯救世界的更多相关文章

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

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

  2. [洛谷P2000 拯救世界]

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

  3. 洛谷 P1506 拯救oibh总部

    P1506 拯救oibh总部 题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用*号表示 ...

  4. luogu P2000 拯救世界

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

  5. 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp

    正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ...

  6. 洛谷 P1506 拯救oibh总部【DFS/Flood Fill】

    题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去 ...

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

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

  8. 【做题笔记】洛谷P1506 拯救oibh总部

    跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ...

  9. [题解] Luogu P2000 拯救世界

    生成函数板子题...... 要写高精,还要NTT优化......异常dl 这个并不难想啊...... 一次召唤会涉及到\(10\)个因素,全部写出来,然后乘起来就得到了答案的生成函数,输出\(n\)次 ...

随机推荐

  1. Android studio 使用flutter插件 运行第一个flutter项目 报错 Warning: License for package Android SDK Build-Tools 28.0.3 not accepted.

    在Android studio中新建了flutter项目.运行报错licence not accepted. Warning: License for package Android SDK Buil ...

  2. SDOI2017 Round1 起点

    第二次打酱油了 高一两次考试以打两瓶酱油告终 来的时候明知自己没戏,却总存有一丝希望 NOIP连200都没考到,是不是有点儿不自量力 如果我真的去争取那一丝希望的话,该有多好 先简单分析下考试 Day ...

  3. 戴尔R720xd服务器系统安装前期环境实现

    型号:R720xd 开启服务器,Ctrl+R进入raid配置 配置完raid后F2对硬盘进行格式化 保存并重启 F11进入BIOS选项设置U盘启动 选择U盘启动 开始进行系统安装!

  4. func_get_args()获取参数

    php中func_get_args()可以获取多个参数,讲多个参数放在数组里面. <?php function show() { $attr = func_get_args();//获取输入的参 ...

  5. Chrome截长屏

    本文地址:https://www.cnblogs.com/veinyin/p/9257833.html   Chrome截取长屏一直是一个痛点,之前尝试过第三方截图工具,但是不是收费就是不怎么好用,今 ...

  6. java后台代码发送邮件

    1:安装  eyoumailserversetup 易邮邮件服务器 注册账号 2:安装Foxmail 登录以后会有个还原页面 3:测试 4:java 代码编写 配置文件: mail.host=http ...

  7. 训练赛第三场A题 zoj 559

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2559 解题报告:比赛的时候的想法是可以确定至少有两对相切的圆,所 ...

  8. 在Linode VPS上搭建最新版Transmission

    在Linode VPS上搭建最新版Transmission 2015-09-16 by Hansen 原文链接:http://www.hansendong.me/archives/124.html 以 ...

  9. Java并发编程(2) AbstractQueuedSynchronizer的设计与实现

    一 前言 上一篇分析AQS的内部结构,其中有介绍AQS是什么,以及它的内部结构的组成,那么今天就来分析下前面说的内部结构在AQS中的具体作用(主要在具体实现中体现). 二 AQS的接口和简单示例 上篇 ...

  10. 使用转义防御XSS

    使用转义防御XSS 在输出的时候防御XSS即对用户输入进行转义,XSS的问题本质上还是代码注入,HTML或者javascript的代码注入,即混淆了用户输入的数据和代码.而解决这个问题,就需要根据用户 ...