题意:
分析:
比较恶心的DP套容斥题。
因为排列个数=所有环排列循环节长度。
可以很容易算出排列个数,但要求其对应的环排列个数。
有个很直观的思路:求出每个环排列个数*其循环节个数的和,将这个和除以排列长度,就能得到换排列个数。
然后利用公式
∑ d ∣ n φ ( d ) = n \sum_{d|n}\varphi(d)=n ∑d∣nφ(d)=n
于是就可以枚举一个数 k k k,求出所有循环节个数为 k k k这个数的倍数的方案数* φ ( k ) \varphi(k) φ(k)
这个就很好表示了。
另外,用X种数共Y个的排列数,是一个上升幂除以一个上升幂的形式,即代码中的t,有兴趣可以推一下,方法很多。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define SF scanf
#define PF printf
#define MAXN 260
using namespace std;
int MOD;
int gcd(int x,int y){
if(y==