【洛谷】P2000 拯救世界
题解
小迪的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 拯救世界的更多相关文章
- 洛谷P2000 拯救世界(生成函数)
		题面 题目链接 Sol 生成函数入门题 至多为\(k\)就是\(\frac{1-x^{k+1}}{1-x}\) \(k\)的倍数就是\(\frac{1}{1-x^k}\) 化简完了就只剩下一个\(\f ... 
- [洛谷P2000 拯救世界]
		生成函数版题. 考虑对于这些条件写出\(OGF\) \(1 + x^6 + x^{12} + x^{18}..... = \frac{1}{1 - x^6}\) \(1 + x + x ^ 2 + x ... 
- 洛谷 P1506 拯救oibh总部
		P1506 拯救oibh总部 题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用*号表示 ... 
- luogu P2000 拯救世界
		嘟嘟嘟 题目有点坑,要你求的多少大阵指的是召唤kkk的大阵数 * lzn的大阵数,不是相加. 看到这个限制条件,显然要用生成函数推一推. 比如第一个条件"金神石的块数必须是6的倍数" ... 
- 洛谷P4823 拯救小矮人 [TJOI2013] 贪心+dp
		正解:贪心+dp 解题报告: 传送门! 我以前好像碰到过这题的说,,,有可能是做过类似的题qwq? 首先考虑这种显然是dp?就f[i][j]:决策到了地i个人,跑了j个的最大高度,不断更新j的上限就得 ... 
- 洛谷 P1506 拯救oibh总部【DFS/Flood Fill】
		题目背景 oibh总部突然被水淹没了!现在需要你的救援…… 题目描述 oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去 ... 
- luogu P2000 拯救世界 生成函数_麦克劳林展开_python
		模板题. 将所有的多项式按等比数列求和公式将生成函数压缩,相乘后麦克劳林展开即可. Code: n=int(input()) print((n+1)*(n+2)*(n+3)*(n+4)//24) 
- 【做题笔记】洛谷P1506 拯救oibh总部
		跑一遍染色法,最后判断哪些位置没被染色即可 一些技巧: 为了判断方便,把字符转换成 int 型的数字. 注意边界问题 详细解释见代码 #include <iostream> #includ ... 
- [题解] Luogu P2000 拯救世界
		生成函数板子题...... 要写高精,还要NTT优化......异常dl 这个并不难想啊...... 一次召唤会涉及到\(10\)个因素,全部写出来,然后乘起来就得到了答案的生成函数,输出\(n\)次 ... 
随机推荐
- numpy取反操作符和Boolean类型
			numpy~运算符和Boolean类型变量 觉得有用的话,欢迎一起讨论相互学习~Follow Me numpy中取反运算符~可以将Boolean类型值取反,这在使用boolean类型数组选择数组中固定 ... 
- python---基础知识回顾(十)进程和线程(py2中自定义线程池和py3中的线程池使用)
			一:自定义线程池的实现 前戏: 在进行自定义线程池前,先了解下Queue队列 队列中可以存放基础数据类型,也可以存放类,对象等特殊数据类型 from queue import Queue class ... 
- javascript精雕细琢(二):++、--那点事
			目录 引言 ++和--在数学运算中的计算规则 ++和--在变量引用时的计算规则 ++和--的数据转换应用 引言 对于接触JS时间不长的前端来说,刚开始要实现诸如轮播图,选项卡等小模块时,肯定会用到in ... 
- charles抓包详解http 与 https
			包工具多种多样,比较好使的还是Charles和Fiddler,下面就简单的介绍下HTTPS的相关原理并以Charles为例来介绍下如何抓取HTTPS协议的包 1.下载charles 可以去charle ... 
- redis内存模型
			前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时,会接触Redis的5种对象类型(字符串 ... 
- [转载].net程序集自动生成版本号
			原文:http://hi.baidu.com/bcbgrand/item/a74a7ba71c3b0ea928ce9dce .net程序版本号的格式是4个十进制数字 比如 2.5.729.2 依次是 ... 
- IT人应当知道的10个行业小内幕
			如果你打算从事IT行业或刚进入这个行业,也许本文下面的小内幕会吓到你,因为这些事平常都不会公开讨论的.如果你是IT资深人士,或许你已经遇到其中的大部分了.如果你愿意,请一起来参与讨论吧. 这些内幕大多 ... 
- Donald Ervin Knuth:最年轻的图灵奖高德纳
			高德纳(Donald Ervin Knuth,1938年),美国著名计算机科学家,斯坦福大学电脑系荣誉教授.高德纳教授被誉为现代计算机科学的鼻祖,在计算机科学及数学领域发表了多部 具广泛影响的论文和著 ... 
- Google Congestion Control介绍
			随着网络带宽的日益增加和便携式设备,如智能手机或平板电脑处理能力的增强,基于互联网的实时通信已经成为热点. 虽然视频会议已商用了多年,特别是SKYPE这样的视频应用在互联网上已有10年时间,但针对实时 ... 
- 矩阵 matrix
			传送门 注意这题时限是2s [问题描述] 有一个n × m的矩阵,你从左上角走到右下角,只能向下和向右走. 每个点上有一个重量v i,j 价值w i,j 的物品,你有一个容量为S的背包,经过一个点你可 ... 
