ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模拟3

2022-05-15 18:04:33  阅读:116  来源: 互联网

标签:dep ll dfs st int lst 模拟



C. SSY的队列 - 高一普及组模拟赛3 - 比赛 - 衡中OI (hszxoj.com)
方法:状态压缩+hash+dfs+记忆化 思路: 首先想到容斥原理,用所有的方案减去一个相同挨着的+两个相同挨着的,但是去重太麻烦,而且各个方案之间相互牵连,不方便实现
那么再仔细看题,可不可以对问题进行简化?
相邻的数差值是m的倍数,那全部摸上m,其实就是余数相同的不能放在一起
问题就抽象成了(3个red,5个blue,7个green排列相同颜色不挨着的方案数),深搜
dfs(dep,lst)第几个位置,上一个哪个种类,O(n^n)超时
发现,如果我知道当前lst组还剩下的人数,接下来还可以用的组别剩的人数分别有几组,我就可以从上面已求出状态转移过来
这个记忆化相当于大大减少了时复杂度O(n^n-相当多的一部分)
1处处特殊处理
const int N=40; const ll mod=1234567891,base=33; int a[N],b[N],c[N],mx,cnt; map<ll,ll>dp[N];//数组开不下 int n,m; ll fac[N]; inline ll dfs(int dep,int lst) { if(dep>n)return 1; memset(b,0,sizeof(b)); _f(i,1,cnt)//0不用算吧?至少不能一起算 { if(i!=lst)b[c[i]]++; } ll st=c[0];//b[i]=j,剩余人数是i的组有j个 _f(i,1,mx)//剩余人数是0个的组数我压根就没算 { st=st*base+b[i]; } st=st*base+((lst)?c[lst]:0);//表示对后边没有影响 if(dp[dep].count(st))return dp[dep][st];//开始统计 ll ans=0; if(c[0]) { c[0]--; ans+=dfs(dep+1,0); c[0]++; ans%=mod; } _f(i,1,cnt)//下一个位置放哪一类人 { if(i!=lst) { if(!c[i])continue; c[i]--; ans+=dfs(dep+1,i); c[i]++; ans%=mod; } } return dp[dep][st]=ans; } bool vis[N]; int main() { freopen("ssy.in","r",stdin); freopen("ssy.out","w",stdout); n=re(); _f(i,1,n) { a[i]=re(); } m=re(); _f(i,1,n) { a[i]%=m; if(a[i]<0)a[i]+=m;//负数的话摸出来也是负数,特殊加一下 } _f(i,1,n) { if(vis[i])continue; vis[i]=1; int ret=1; _f(j,i+1,n) { if(a[i]==a[j])vis[j]=1,ret++; } if(ret==1)c[0]++;//c[i]模数是相同的人分别有几个 else c[++cnt]=ret;//Cnt没有实际意义 mx=max(mx,ret); } fac[0]=1;ll ans=1; _f(i,1,n)fac[i]=fac[i-1]*i%mod; _f(i,0,cnt)ans=ans*fac[c[i]]%mod; ll po=dfs(1,0); ans=ans*po%mod; chu("%lld",ans); return 0; }

 

标签:dep,ll,dfs,st,int,lst,模拟
来源: https://www.cnblogs.com/403caorong/p/16273819.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有