题解 [ABC256G] Black and White Stones
1.题解 [ABC256G] Black and White Stones
2.题解 AT abc308_g3.题解 [AT_joisc2014_i][BZOJ4237]稻草人4.题解 AT_ddcc2017_final_e 足のばし洛谷。
题意
有一个
分析
首先对于环形的题目,我们可以想到一个重要技巧:拆环成链。我们将
很显然,我们第一个需要满足的条件即是我们的首石子与末石子颜色需要相同,其次为每条边的白色石子个数相同。
对于我们的第二个条件,我们可以枚举我们每条边的白色石子个数。
我们设计一个状态:
那么我们对这个状态进行转移,令枚举的白色石子的数量为
由此,我们就可以写出我们的暴力:
dp[0][0][0]=dp[0][1][1]=1; for(int i=1; i<=n; i++) { dp[i][0][0]=(dp[i-1][0][1]*C(d-1,x-1)%mod+dp[i-1][0][0]*C(d-1,x) %mod)%mod; dp[i][0][1]=(dp[i-1][0][1]*C(d-1,x-2)%mod+dp[i-1][0][0]*C(d-1,x-1)%mod)%mod; dp[i][1][0]=(dp[i-1][1][0]*C(d-1,x) %mod+dp[i-1][1][1]*C(d-1,x-1)%mod)%mod; dp[i][1][1]=(dp[i-1][1][0]*C(d-1,x-1)%mod+dp[i-1][1][1]*C(d-1,x-2)%mod)%mod; } ans=(ans+dp[n][0][0]+dp[n][1][1])%mod);
时间复杂度:
正解
我们可以发现,我们对于枚举的这个数量下,我们转移的几个参数都是相同的。
也就是说,我们每添加一条边的转移都是相同的,再加上我们的
inline int solve(int X) { init(X);//预处理ans与bas int cnt=n; while(cnt) { if(cnt&1) ans=ans*bas; bas=bas*bas; cnt>>=1; } return (ans.a[1][1]+ans.a[1][4])%MOD; }
对于我们的排列组合的处理,我们可以以
整体的复杂度为:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】