[XSY 3322][置换+dp]Dexterity
我们很容易发现。R必须为置换。
当A=B=C=0的时候,我们对于L没有限制,只要求R是个置换。
并满足R2=ER^2=ER2=E,采用dp。fi=fi−1+(i−1)∗fi−2f_i=f_{i-1}+(i-1)*f_{i-2}fi=fi−1+(i−1)∗fi−2
最后答案即为fn∗nnf_n*n^nfn∗nn
当A,B,C中有一个不为0的时候,L,R都是置换。
并且它们满足式子:
LARLBRLC=E\ \ \ \ \ \ \ \ \ \ \ \ \ L^ARL^BRL^C=E LARLBRLC=E
LCLARLBRLCL−C=E\ L^CL^ARL^BRL^CL^{-C}=E LCLARLBRLCL−C=E
LA+CRLBR=E\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ L^{A+C}RL^BR=E LA+CRLBR=E
LA+C−BLBRLBR=EL^{A+C-B}L^BRL^BR=ELA+C−BLBRLBR=E
注意到,当我们确定了L,我们想要LBRL^BRLBR是任何置换都行。
因此,求出满足条件的L,R的方案数等价于求满足
LA+C−BR2=EL^{A+C-B}R^2=ELA+C−BR2=E
LA+C−B=R−2\ \ \ \ \ L^{A+C-B}=R^{-2} LA+C−B=R−2的置换
类似的,上面式子等价于
L∣A+C−B∣=R2L^{|A+C-B|}=R^2L∣A+C−B∣=R2
我们相当于要求出La=R2L^a=R^2La=R2
接下来我们采用dp解决。
直接解决有点难,我们考虑间接解决。
令Z=La=R2Z=L^a=R^2Z=La=R2
我们求出LaL^aLa到ZZZ的方案数t1,
再求出ZZZ分解成R2R^2R2的方案数t2,Ans+=t1∗t2Ans+=t1*t2Ans+=t1∗t2
我们令fi,jf_{i,j}fi,j表示ZZZ中j个长度为i的环,LaL^aLa有多少种方法可以达到。
注意到,LLL中一个长度为lll的环,会被分解成gcd(a,l)gcd(a,l)gcd(a,l)个长度为lgcd(a,l)\frac{l}{gcd(a,l)}gcd(a,l)l的环。
那么,我们枚举第一个点原来在那个大环,有递推式:
fi,j=∑k=1i∗j[kgcd(k,a)==i](i∗j−1)!i∗(j−gcd(k,a))!fi,j−gcd(k,a)f_{i,j}=\sum_{k=1}^{i*j}[\frac{k}{gcd(k,a)}==i]\frac{(i*j-1)!}{i*(j-gcd(k,a))!}f_{i,j-gcd(k,a)}fi,j=∑k=1i∗j[gcd(k,a)k==i]i∗(j−gcd(k,a))!(i∗j−1)!fi,j−gcd(k,a)
我们令gi,jg_{i,j}gi,j表示ZZZ中j个长度为i的环有多少中方式分解成R2R^2R2
注意,这个时候已经确定了次序。
我们有递推式:gi,j=gi,j−1+(j−1)∗i∗gi,j−2g_{i,j}=g_{i,j-1}+(j-1)*i*g_{i,j-2}gi,j=gi,j−1+(j−1)∗i∗gi,j−2(想一想,为什么)
最后,我们令hi,j=fi,j∗gi,jh_{i,j}=f_{i,j}*g_{i,j}hi,j=fi,j∗gi,j
背包合并一下即可。
时间复杂度:O(Tn2log2n)O(Tn^2log_2n)O(Tn2log2n)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int Mod=998244353;
typedef unsigned long long ull;
int n;
ull A,B,C;
#define Maxn 1005
int sum[Maxn];
int fact[Maxn],inv[Maxn];
vector<int> vec[Maxn];
int f[Maxn][Maxn],g[Maxn][Maxn];
int way[Maxn],Ans[Maxn];
int c[Maxn][Maxn];ull gcd(ull a,ull b){if(!b)return a;return gcd(b,a%b);
}inline int Fast_Pow(int a,int b){int ans=1;while(b){if(b&1)ans=1ll*ans*a%Mod;a=1ll*a*a%Mod;b>>=1;}return ans;
}int main(){c[0][0]=1;for(register int i=1;i<=1000;++i){c[i][0]=1;for(register int j=1;j<=i;++j){c[i][j]=c[i-1][j]+c[i-1][j-1];if(c[i][j]>=Mod)c[i][j]-=Mod;}}for(register int i=1;i<=1000;++i){g[i][0]=1;g[i][1]=i&1;for(register int j=2;j<=1000;++j)g[i][j]=(1ll*g[i][j-1]*(i&1)+1ll*g[i][j-2]*(j-1)*i)%Mod;}fact[0]=1;for(int i=1;i<=1000;++i)fact[i]=1ll*fact[i-1]*i%Mod;inv[0]=inv[1]=1;for(int i=2;i<=1000;++i)inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod;for(int i=2;i<=1000;++i)inv[i]=1ll*inv[i-1]*inv[i]%Mod;int T;scanf("%d",&T);while(T--){memset(Ans,0,sizeof(Ans));memset(f,0,sizeof(f));scanf("%d%llu%llu%llu",&n,&A,&B,&C);for(register int i=1;i<=n;++i)vec[i].clear();if(A==0&&B==0&&C==0){sum[0]=1;for(register int i=1;i<=n;++i){sum[i]=sum[i-1];if(i>1)sum[i]=(sum[i]+1ll*(i-1)*sum[i-2])%Mod;}printf("%d\n",1ll*sum[n]*Fast_Pow(n,n)%Mod);continue;}A=A+C;if(A>=B)A-=B;else A=B-A;for(register int i=1;i<=n;++i){int tmp=gcd(A,i);vec[i/tmp].push_back(tmp);}Ans[0]=1;for(register int i=1;i<=n;++i){f[i][0]=1;for(register int j=1;j<=n/i;++j){for(register int k=0;k<vec[i].size();++k)if(j>=vec[i][k])f[i][j]=(f[i][j]+1ll*f[i][j-vec[i][k]]*fact[i*j-1]%Mod*inv[i*(j-vec[i][k])])%Mod;else break;}for(register int j=0;j<=n/i;++j)way[j]=1ll*f[i][j]*g[i][j]%Mod;for(register int j=n;j>=0;--j){int ans=0;for(register int k=0;k*i<=j;++k)ans=(ans+1ll*Ans[j-k*i]*way[k]%Mod*c[j][i*k])%Mod;Ans[j]=ans;}}printf("%d\n",Ans[n]);}return 0;
}
[XSY 3322][置换+dp]Dexterity相关推荐
- POJ-3590 The shuffle Problem 置换+DP | DFS
题目链接:http://poj.org/problem?id=3590 自己暴力给水过去了,不过效率有点低.题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大.题目数据量不大, ...
- [XSY] 相似(DP套DP)
相似 在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解: https://blog.csdn.net/Ike940067893/a ...
- [XSY] 计数(DP,NTT,分治)
计数 考虑转化题目,变为网格上有若干个点,要从(0,0)(0,0)(0,0)走到(n,an+1)(n,a_{n+1})(n,an+1) ,每一步只能往右走一步或往上走一步,且若当前在(i,j)(i, ...
- android最佳开发实现_在android开发中使用可访问性最佳做法
android最佳开发实现 As you know, accessibility is about building products that everyone can use easily and ...
- 无障碍设计_我通过无障碍设计中学到的5课
无障碍设计 重点 (Top highlight) 18 months ago, I joined the Android team at Google as its first Android Acc ...
- BZOJ第一页刷题计划
BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...
- 2018 秦皇岛CCPC-Wannafly Winter Camp Day4 Div2 题解
A:夺宝奇兵 贪心的想法,就是每次到下一个节点时有两种方案如图,选择花费较小的,每走到下一个节点都如此,注意此oj可能和cf一样不支持I64d. #include <cstdio> #in ...
- 操作系统面试题(史上最全、持续更新)
尼恩面试宝典专题40:操作系统面试题(史上最全.持续更新) 本文版本说明:V28 <尼恩面试宝典>升级规划为: 后续基本上,每一个月,都会发布一次,最新版本,可以联系构师尼恩获取, 发送 ...
- [XSY] 选举(线段树优化dp)
选举 //a[i]=1 or 0 or -1,表示i支持小奇 or 中立 or 支持魔法猪 //sum[i]=a[1]+a[2]+...+a[i] //设dp[i]表示把1~i划分成若干区间,(小奇得 ...
最新文章
- C#创建Windows服务
- 热点快评:德国强化AI战略,系统、技术等“多轮并行”
- 唐山一个葬礼上的豪华车队
- UART 和 USART 的区别 == 通用异步收发传输器 通用同步/异步串行接收/发送器
- Java虚拟机学习(2):垃圾收集算法
- C++中的空指针和void * 指针
- 网工路由基础(8)路由重分布
- 兼容性好的overflow CSS清除浮动一例
- 深度:抖音本地生活服务的真相
- iOS开发---设计素材篇2
- UVA12633 Super Rooks on Chessboard
- 校园导航系统(查询各景点信息,多个建筑点的最佳访问路径、任意点的建筑查询) 超详细!! 博主可答疑,代码免费给
- python udp 直播_Python使用UDP协议实现局域网内屏幕广播
- Activiti7事件监听
- [算法]px4位置估计-inav (2017/10/26更新)
- office转换pdf [doc,docx,xls,xlsx]
- lzg_ad:如何自定义Shell组件
- 基站定位(Google API)
- Burpsuite的基本使用介绍
- oracle升级版本矩阵图