我们很容易发现。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(Tn2log2​n)

#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相关推荐

  1. POJ-3590 The shuffle Problem 置换+DP | DFS

    题目链接:http://poj.org/problem?id=3590 自己暴力给水过去了,不过效率有点低.题目要求的就是给一个数n,要你求出一种方案,一些和为n的数的最小公倍数最大.题目数据量不大, ...

  2. [XSY] 相似(DP套DP)

    相似 在看这道题前,有必要先看一下DP套DP的入门题[uoj3864]Hero meet devil,附上两篇写得不错的题解: https://blog.csdn.net/Ike940067893/a ...

  3. [XSY] 计数(DP,NTT,分治)

    计数 考虑转化题目,变为网格上有若干个点,要从(0,0)(0,0)(0,0)走到(n,an+1)(n,a_{n+1})(n,an+1​) ,每一步只能往右走一步或往上走一步,且若当前在(i,j)(i, ...

  4. android最佳开发实现_在android开发中使用可访问性最佳做法

    android最佳开发实现 As you know, accessibility is about building products that everyone can use easily and ...

  5. 无障碍设计_我通过无障碍设计中学到的5课

    无障碍设计 重点 (Top highlight) 18 months ago, I joined the Android team at Google as its first Android Acc ...

  6. BZOJ第一页刷题计划

    BZOJ第一页刷题计划 已完成:67 / 90 [BZOJ1000]A+B Problem:A+B: [BZOJ1001][BeiJing2006]狼抓兔子:最小割: [BZOJ1002][FJOI2 ...

  7. 2018 秦皇岛CCPC-Wannafly Winter Camp Day4 Div2 题解

    A:夺宝奇兵 贪心的想法,就是每次到下一个节点时有两种方案如图,选择花费较小的,每走到下一个节点都如此,注意此oj可能和cf一样不支持I64d. #include <cstdio> #in ...

  8. 操作系统面试题(史上最全、持续更新)

    尼恩面试宝典专题40:操作系统面试题(史上最全.持续更新) 本文版本说明:V28 <尼恩面试宝典>升级规划为: 后续基本上,每一个月,都会发布一次,最新版本,可以联系构师尼恩获取, 发送 ...

  9. [XSY] 选举(线段树优化dp)

    选举 //a[i]=1 or 0 or -1,表示i支持小奇 or 中立 or 支持魔法猪 //sum[i]=a[1]+a[2]+...+a[i] //设dp[i]表示把1~i划分成若干区间,(小奇得 ...

最新文章

  1. C#创建Windows服务
  2. 热点快评:德国强化AI战略,系统、技术等“多轮并行”
  3. 唐山一个葬礼上的豪华车队
  4. UART 和 USART 的区别 == 通用异步收发传输器 通用同步/异步串行接收/发送器
  5. Java虚拟机学习(2):垃圾收集算法
  6. C++中的空指针和void * 指针
  7. 网工路由基础(8)路由重分布
  8. 兼容性好的overflow CSS清除浮动一例
  9. 深度:抖音本地生活服务的真相
  10. iOS开发---设计素材篇2
  11. UVA12633 Super Rooks on Chessboard
  12. 校园导航系统(查询各景点信息,多个建筑点的最佳访问路径、任意点的建筑查询) 超详细!! 博主可答疑,代码免费给
  13. python udp 直播_Python使用UDP协议实现局域网内屏幕广播
  14. Activiti7事件监听
  15. [算法]px4位置估计-inav (2017/10/26更新)
  16. office转换pdf [doc,docx,xls,xlsx]
  17. lzg_ad:如何自定义Shell组件
  18. 基站定位(Google API)
  19. Burpsuite的基本使用介绍
  20. oracle升级版本矩阵图

热门文章

  1. fixable with the `--fix` option.
  2. CentOS 8.1安装MySQL 8.0详解
  3. Spring的工作原理(一)简介
  4. E1协议转换器使用中常见故障问题及处理方法总结
  5. 云虚拟主机、云服务器、VPS三者有什么区别?
  6. 英国情报机构授权开设“网络间谍”硕士专业!
  7. 工业智能网关BL110应用之62:如何实现智能楼宇控制BACnet 接入亚马逊云平台
  8. Wannafly挑战赛14 A-直角三棱锥
  9. 【GPGPU编程】GPGPU架构剖析之谓词寄存器
  10. JS - 函数柯里化