P2000-拯救世界【生成函数,NTT】

正题

题目链接:https://www.luogu.com.cn/problem/P2000


题目大意

十种东西,有要求

金神石A的块数必须是 6 的倍数。
木神石A最多用 9 块。
水神石A最多用 5 块。
火神石A的块数必须是 4 的倍数。
土神石A最多用 7 块。
金神石B的块数必须是 2 的倍数。
木神石B最多用 1 块。
水神石B的块数必须是 8 的倍数。
火神石B的块数必须是 10 的倍数。
土神石B最多用 3 块。

要求所有物品物件和为nnn,求方案数。


解题思路

考虑生成函数,用生成函数分别表示就是
(1+x6+x12+x18+...)∗(x1+x2+...x9)∗...(1+x^6+x^{12}+x^{18}+...)*(x^1+x^2+...x^9)*...(1+x6+x12+x18+...)(x1+x2+...x9)...
推下去,我们可以化简后得出
11−x6∗1−x101−x∗1−x61−x∗11−x4∗1−x81−x\frac{1}{1-x^6}*\frac{1-x^{10}}{1-x}*\frac{1-x^6}{1-x}*\frac{1}{1-x^4}*\frac{1-x^8}{1-x}1x611x1x101x1x61x411x1x8

∗*

11−x2∗1−x21−x∗11−x8∗11−x10∗11−x3\frac{1}{1-x^2}*\frac{1-x^2}{1-x}*\frac{1}{1-x^8}*\frac{1}{1-x^{10}}*\frac{1}{1-x^3}1x211x1x21x811x1011x31
然后约分后得到
原式=1(1−x)5=Cn+44原式=\frac{1}{(1-x)^5}=C^{4}_{n+4}=(1x)51=Cn+44

最后化简成组合数我是不会的,但是换种方法可以理解为
1(1−x)2=(∑i=0∞xi)5\frac{1}{(1-x)^2}=(\sum_{i=0}^{\infty}x^i)^5(1x)21=(i=0xi)5
就是将nnn个数划分成五段的方案数(可以为空)

这样就可以化简成那个组合数

然后考虑高精度计算Cn+44=(n+1)∗(n+2)∗(n+3)∗(n+4)24C^4_{n+4}=\frac{(n+1)*(n+2)*(n+3)*(n+4)}{24}Cn+44=24(n+1)(n+2)(n+3)(n+4)

因为数据很大,需要NTTNTTNTT优化高精度,这里的方法是,

因为原本的乘法需要模101010,不是质数很难搞,这里我们可以先让他模一个大质数,计算完后再统一进位(这里需要保证两个位上的数相乘不会大于那个大质数)

然后除单精就好了


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e6+10,XJQ=998244353;
char s[N];
ll n,L,invn;
ll a[N],b[N],r[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%XJQ;x=x*x%XJQ;b>>=1;}return ans;
}
void NTT(ll *x,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(x[i],x[r[i]]);for(ll p=2;p<=n;p<<=1){ll l=p>>1,tmp=power(3,(XJQ-1)/p);if(op==-1)tmp=power(tmp,XJQ-2);for(ll k=0;k<n;k+=p){ll buf=1;for(ll i=k;i<k+l;i++){ll tt=buf*x[i+l]%XJQ;x[l+i]=(x[i]-tt+XJQ)%XJQ;x[i]=(x[i]+tt)%XJQ;buf=buf*tmp%XJQ;}}}if(op==-1)for(ll i=0;i<n;i++)x[i]=x[i]*invn%XJQ;return;
}
void mul(ll x){for(ll i=0;i<L;i++)b[L-i-1]=s[i]-'0';b[0]+=x;NTT(a,1);NTT(b,1);for(ll i=0;i<n;i++)a[i]=a[i]*b[i]%XJQ,b[i]=0;NTT(a,-1);for(ll i=0;i<n;i++){(a[i+1]+=a[i]/10)%XJQ;a[i]%=10;}return;
}
int main()
{scanf("%s",s);L=strlen(s);for(ll i=0;i<L;i++)a[L-i-1]=s[i]-'0';for(n=1;n<=L*5;n<<=1);for(ll i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);invn=power(n,XJQ-2);a[0]++;for(ll i=2;i<=4;i++)mul(i);for(ll i=n-1;i>=0;i--)a[i-1]+=a[i]%24*10,a[i]/=24;ll w=n-1;while(!a[w])w--;for(;w>=0;w--)printf("%lld",a[w]);
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【模拟】生日蛋糕(jzoj 1613)

生日蛋糕 题目大意&#xff1a; 一个正方形蛋糕&#xff0c;竖着横着各切一刀&#xff0c;使他变成四块正方形蛋糕&#xff0c;蛋糕中有一些巧克力&#xff0c;而小明只能拿巧克力最少的一块&#xff0c;请问小明要怎么切才能吃到最多的巧克力 样例输入 8 …#…#… .##……

使用.NET Core与Google Optimization Tools实现加工车间任务规划

前一篇文章《使用.NET Core与Google Optimization Tools实现员工排班计划Scheduling》算是一种针对内容的规划&#xff0c;而针对时间顺序任务规划&#xff0c;加工车间的工活儿是一个典型的场景。在加工车间有不同的工活儿&#xff0c;一般称为作业&#xff0c;每种作业都有多…

P6047-丝之割【斜率优化,dp】

前言 然而丝之鸽还是没有出 正题 题目链接:https://www.luogu.com.cn/problem/P6047 题目大意 两个平行的线&#xff0c;上面连接着若干条弦&#xff0c;第iii条连接上方的xix_ixi​个下方的yiy_iyi​。 然后每次可以选择一个位置(i,j)(i,j)(i,j)&#xff0c;可以切断任何位…

洛谷P1373 小a和uim之大逃离 动态规划

题解 我们可以先简单的想一种状态&#xff0c;也就是dp[i][j][x][y][t]dp[i][j][x][y][t]dp[i][j][x][y][t]&#xff0c;这是最暴力的。 当t0t 0t0时&#xff0c;表示小a处于(i,j)(i,j)(i,j)位置&#xff0c;其中小a拥有x魔液&#xff0c;uim拥有y的魔液时候的方案总数。t1t …

【模拟】游戏(jzoj 1614)

游戏 题目大意&#xff1a; 有一个n*n的棋盘&#xff0c;有一个坐标在x,y的棋子&#xff0c; 1、2号玩家可以将他向左&#xff0c;向下&#xff0c;向左下&#xff08;45∘45^{\circ}45∘&#xff09;移动若干格&#xff0c;假如他们都是AKIOI聪明绝顶的巨佬&#xff0c;请问…

VSTS + XX云服务器构建netcore+docker持续集成交付部署

持续集成交付部署是什么意思,它给我们带来什么好处&#xff1f;先贴一张图持续集成&#xff08;Continuous Integration&#xff09;持续集成强调开发人员提交了新代码之后&#xff0c;立刻进行构建、&#xff08;单元&#xff09;测试(这个要看情况了是否需要)持续交付&#x…

codeforces E. Game with String 概率

题意 这道题目的叙述不好理解&#xff1a; 给你一个字符串ss,小a和小b都知道。现在小b要把字符串的左边一段移动到最右边,生成一个新的字符串s&#x2032;" role="presentation" style="position: relative;">s′s′&#xff0c;小a只知道s′…

P4593-[TJOI2018]教科书般的亵渎【拉格朗日差值】

正题 题目链接:https://www.luogu.com.cn/problem/P4593 题目大意 场上有若干只怪&#xff0c;最高的为nnn&#xff0c;每个怪血量不同&#xff0c;有mmm个血量不存在。 不停释放亵渎&#xff08;全场打一&#xff0c;如果有怪死亡就再次生效&#xff09;&#xff0c;每次一…

【链表】【树形DP】最大利润(jzoj 1487)

最大利润 题目大意&#xff1a; 有n个车站&#xff0c;每个车站有一定的人数&#xff0c;有n-1条线路连接着这些车站&#xff0c;相邻的车站不能同时有两个餐厅&#xff0c;当在一个车站建立餐厅时&#xff0c;会得到这个车站所有人的monny&#xff08;1个人可以得到1份利润&…

P2617-Dynamic Rankings【树套树】

正题 题目链接:https://www.luogu.com.cn/problem/P2617 题目大意 给出一个序列&#xff0c;要求支持 区间查询第kkk大单点修改 解题思路 区间查询第kkk大需要使用主席树&#xff0c;构建权值线段树的前缀和。考虑如何进行单点修改&#xff0c;在前缀和上进行单点修改就是进…

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包

MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性&#xff0c;它使得我们可以用 C# 语言编写扩展&#xff1b;利用这种扩展性&#xff0c;我们可以为我们的项目定制一部分的编译细节。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法&#xff0c;同时还…

codeforces F.F. Teodor is not a liar! 最长不降子序列

题意 给出一堆线段。 询问者每次可以询问一个整数点&#xff0c;回答者告诉询问者这个点被多少根线段包括。 问询问者最多问多少次&#xff0c;还不能确定任意一个整数点都不可能被所有的线段包含。 题解 首先用O(n)的方法计算出来每个点被多少条线段包含。 突破点&#x…

2019.01.23【NOIP普及组】模拟赛C组总结

总结 这次的分数是1001000100300 第一题第一题一开始把题看错了&#xff0c;乱打一通&#xff0c;结果才发现自己打错了&#xff0c;把题看清后&#xff0c;就知道用栈&#xff0c;快速解决。第二题和之前做过的一道题十分相似&#xff0c;就是用前缀和来将求一个范围内的巧克…

P2149-[SDOI2009]Elaxia的路线【最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P2149 题目大意 nnn个点mmm条边的一张无向图&#xff0c;给定两个起点和对应的终点。求两个最短路的最长公共距离 解题思路 首先要求是最短路&#xff0c;我们可以先跑一次第一个起点的SPFASPFASPFA&#xff0c;然后从终点开…

Platform.Uno介绍

编者语&#xff1a;Xamarin国内很多人说缺乏可用的实例&#xff0c;我在写书过程中在完善一些常用场景的例子&#xff0c;希望帮到大家。Build 2018结束一周了&#xff0c;善友问我要不要谈谈Xamarin的一些变化&#xff0c;但碍于时间有限一直没有付诸行动。想想总得写点什么给…

codeforces F.Fibonacci String Subsequences

题意 定义F(x)为F(x-1)与F(x-2)的连接&#xff08;其中F(0) ‘0’,F(1) ‘1’&#xff09;。 给出一个长度不超过100的字符串s&#xff0c;询问s在F(x)的所有子序列中出现了多少次。 题解 数量很大的计数问题&#xff0c;我们首先想到的解决方案就是dp。 我们考虑F(x) F…

【dfs】GCD与LCM(jzoj 1608)

GCD与LCM 题目大意&#xff1a; 给出a,b的最大公因数和最小公倍数&#xff0c;求出符合条件的a,b的最小差值 样例输入 6 36 样例输出 6 数据范围限制 提示 数据说明&#xff1a; 对于50%的数据&#xff0c;1<a<b<10^3。 对于100%的数据&#xff0c;1<a&…

P3889-[GDOI2014]吃【线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3889 题目大意 nnn个数的序列&#xff0c;mmm次询问&#xff0c;每次给出一个区间[l,r][l,r][l,r]&#xff0c;求在区间内和区间外各选一个数使得他们的gcdgcdgcd最大 解题思路 首先没有修改且没有要求强制在线&#xff0c;…

ASP.NET Core amp; Docker 实战经验分享

一.前言最近一直在研究和实践ASP.NET Core、Docker、持续集成。在ASP.NET Core 和 Dcoker结合下遇到了一些坑&#xff0c;在此记录和分享&#xff0c;希望对大家有一些帮助。二.中间镜像我前面写过一个 《ASP.NET Core & Docker 零基础持续集成 》的教程。里面我们通过持续…

codeforces E. Picking Strings 构造

题目链接 Picking String 题意 给出字符串S和T&#xff0c;1e5个询问&#xff0c;每次询问S的一段区间是否能转变成T的一段区间。 转变方式&#xff1a; A>BCA>BCB>ACB>ACC>ABC>ABAAAAAA可以消除 题解 我们从以上四个条件出发推导出更加精华的条件 B>…