2024.11.26 鲜花
传话游戏题解
七里香
窗外的麻雀 在电线杆上多嘴 你说这一句 很有夏天的感觉 手中的铅笔 在纸上来来回回 我用几行字形容你是我的谁 秋刀鱼 的滋味 猫跟你都想了解 初恋的香味就这样被我们寻回 那温暖 的阳光 像刚摘的鲜艳草莓 你说你舍不得吃掉这一种感觉 雨下整夜 我的爱溢出就像雨水 院子落叶 跟我的思念厚厚一叠 几句是非 也无法将我的热情冷却 你出现在我诗的每一页 雨下整夜 我的爱溢出就像雨水 窗台蝴蝶 像诗里纷飞的美丽章节 我接着写 把永远爱你写进诗的结尾 你是我唯一想要的了解 雨下整夜 我的爱溢出就像雨水 院子落叶 跟我的思念厚厚一叠 几句是非 也无法将我的热情冷却 你出现在我诗的每一页 那饱满 的稻穗 幸福了这个季节 而你的脸颊像田里熟透的番茄 你突然 对我说 七里香的名字很美 我此刻却只想亲吻你倔强的嘴 雨下整夜 我的爱溢出就像雨水 院子落叶 跟我的思念厚厚一叠 几句是非 也无法将我的热情冷却 你出现在我诗的每一页 整夜 我的爱溢出就像雨水 窗台蝴蝶 像诗里纷飞的美丽章节 我接着写 把永远爱你写进诗的结尾 你是我唯一想要的了解
不是都听了一辈子了,能不能换一首
属于是思维极高的题,下辈子也想不到。
没有歧义时将
首先考虑什么时候会重复,显然是当删除两个不同位置后结果一样。
设第
我们将贡献同统一钦定放到后面,也就是说
考虑形式化描述不合法的情况:
容易发现这是序列不重的必要条件,感觉上也是充分的,考虑证明其充分性。
对于每个
考虑统计,发现这个限制依然不太好做,发现对于一个
它等价于一个最小的
具体的,设
考虑优化,发现
考虑干掉
证明也不难,考虑
所以用拉差差出来即可。
复杂度是 __int128_t
存值减少上界的取模(但是不要将 dp 数组开 __int128_t
)。
Code
#include<bits/stdc++.h> using namespace std; using llt=long long; using llf=long double; using ull=unsigned long long; #ifdef LOCAL FILE *InFile=freopen("in_out/in.in","r",stdin),*OutFile=freopen("in_out/out.out","w",stdout); #else FILE *InFile=freopen("message.in","r",stdin),*OutFile=freopen("message.out","w",stdout); #endif const int M=207,MOD=1e9+7; int dp[M][M][M],fac[M],ivf[M],n,m; int cs[M]; class LGG{ private: int cy[M],lmu[M],rmu[M],len; public: void In(){len=m+2; for(int i=1;i<=len;++i) cy[i]=dp[1][m][i];} int operator()(int x){ int y=0; memset(lmu,0,sizeof(lmu)),memset(rmu,0,sizeof(rmu)); lmu[0]=1; for(int i=1;i<=len;++i) lmu[i]=1ll*lmu[i-1]*(x-i)%MOD; rmu[len+1]=1; for(int i=len;i;--i) rmu[i]=1ll*rmu[i+1]*(x-i)%MOD; for(int i=1;i<=len;++i) y=(y+1ll*cy[i]*lmu[i-1]%MOD*rmu[i+1]%MOD*ivf[i-1]%MOD*ivf[len-i]%MOD*(len-i&1?-1:1)+MOD)%MOD; return y; } }Lgg; int main(){ ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr); cin>>n>>m; for(int i=1;i<=m;++i) cin>>cs[i]; fac[0]=1; for(int i=1;i<=M-3;++i) fac[i]=1ll*fac[i-1]*i%MOD; cerr<<fac[M-3]<<endl; ivf[M-3]=657408467; for(int i=M-3;i;--i) ivf[i-1]=1ll*ivf[i]*i%MOD; for(int i=1;i<=m;++i) for(int j=0;j<=m+2;++j) dp[i][i-1][j]=dp[i+1][i][j]=1; for(int ln=1;ln<=m;++ln) for(int l=1;l+ln-1<=m;++l){ int r=l+ln-1; dp[l][r][0]=0; for(int v=1;v<=m+2;++v){ __int128_t t=0; for(int k=l;k<=r;++k) if(cs[k]!=cs[r+1]) t+=1ll*dp[l][k-1][v-1]*dp[k+1][r][v]; dp[l][r][v]=(t+dp[l][r][v-1])%MOD; } } Lgg.In(); cout<<Lgg(n)<<endl; }
P
本文来自博客园,作者:5k_sync_closer,转载请注明原文链接:https://www.cnblogs.com/xrlong/p/18571010
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了