总结:第一次打,有点拉,\(A,B\)都是简单题,就不说了
/*D - Hamiltonian Cycle*/
#include<bits/stdc++.h>
using namespace std;
int read(){
char c = getchar();
int x = 0;
while(c < ‘0‘ || c > ‘9‘) c = getchar();
while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - 48,c = getchar();
return x;
}
const int _ = 2e5 + 7;
int P,a,b,inva,invb;
int qpow(int x,int y){
int ans = 1;
while(y){
if(y & 1) ans = 1ll * ans * x % P;
x = 1ll * x * x % P;
y >>= 1;
}
return ans;
}
int used[_];
int main(){
freopen("D.in","r",stdin);
P = read();a = read(),b = read();
inva = qpow(a,P-2),invb = qpow(b,P-2);
int x = 1;int oa = 0;
while(1){
oa++;
x = 1ll * x * a % P;
if(x == 1) break;
}
x = 1;int ob = 0;
while(1){
ob++;
x = 1ll * x * b % P;
if(x == 1) break;
}
if(oa == P - 1){
x = 1;
puts("Yes") ;
while(1){
printf("%d ",x);
x = 1ll * x * a % P;
if(x == 1) break;
}
printf("%d ",1);
return 0;
}
if(ob == P - 1){
x = 1;
puts("Yes");
while(1){
printf("%d ",x);
x = 1ll * x * b % P;
if(x == 1) break;
}
printf("%d ",1);
return 0;
}
int n = oa;x = 1;
for(int i = 1; i <= n; ++i) x = 1ll * x * a % P,used[x] = 1;
int m = 1;x = 1;
while(1){
x = 1ll * x * b % P;
if(used[x]) break;
m++;
}
if(1ll * n * m != P - 1) return puts("No"),0;
puts("Yes");
if(m & 1) swap(n,m),swap(a,b),swap(inva,invb);
// cout<<n<<‘ ‘<<m<<endl;
printf("%d ",1);
x = 1;
memset(used,0,sizeof(used));
oa = 0,ob = 0;
for(int i = 1; i < n; ++i){
x = 1ll * x * a % P,printf("%d ",x),used[x]++;
// if(i == 3) cout<<oa<<‘ ‘<<ob<<"!!!"<<endl;
}
for(int i = 1; i < m; ++i) x = 1ll * x * b % P,printf("%d ",x),used[x]++;
for(int i = 1; i < n; ++i) x = 1ll * x * inva % P,printf("%d ",x),used[x]++;
bool lst = 0;
for(int i = 1; i < m; ++i){
x = 1ll * x * invb % P,printf("%d ",x),used[x]++;
if(i == m - 1) break;
if(lst){
for(int j = 1; j < n - 1; ++j){
x = 1ll * x * inva % P,printf("%d ",x),used[x]++;
}
}
else{
for(int j = 1; j < n - 1; ++j) x = 1ll * x * a % P,printf("%d ",x),used[x]++;
}
lst ^= 1;
}
return 0;
}
/*E - Avoid Permutations*/
#include<bits/stdc++.h>
using namespace std;
int read(){
char c = getchar();
int x = 0,f = 1;
while(c < ‘0‘ || c > ‘9‘) f = (c == ‘-‘)?-1:f,c = getchar();
while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - 48,c = getchar();
return x * f;
}
const int _ = 2e2 + 7;
int dp[_][_][_][2][2];
int fac[_];int p[_],n;
bool row[_],col[_];
#define mod 998244353
void add(int &x,int y){
x += y - mod;
x += (x >> 31) & mod;
}
int main(){
memset(p,-1,sizeof(p));
fac[0] = 1;
n = read();for(int i = 1; i <= n; ++i) fac[i] = 1ll * fac[i-1] * i % mod;
int K = 0;
for(int i = 1; i <= n; ++i){
p[i] = read(),K += (p[i] != -1);
if(p[i] != -1) row[i] = 1,col[p[i]] = 1;
}
dp[0][0][0][0][0] = 1;
for(int i = 0; i <= n + 1; ++i){
for(int j = 0; j <= n + 1; ++j){
for(int k = 0; k <= n - K; ++k){
for(int o1 = 0; o1 <= 1; ++o1){
for(int o2 = 0; o2 <= 1; ++o2){
int val = dp[i][j][k][o1][o2];
if(!val) continue;
/*向右走*/
int ni = i,nj = j + 1;
if(p[ni] != nj){
if(o1 == 0 && !row[ni] && !col[nj] && ni >= 1 && ni <= n && nj >= 1 && nj <= n){/*钦定下一个是障碍点*/
add(dp[ni][nj][k+1][1][1],val);
}
add(dp[ni][nj][k][o1][0],val);
}
/*向下走*/
ni = i + 1;nj = j;
if(p[ni] != nj){
if(o2 == 0 && !row[ni] && !col[nj] && ni >= 1 && ni <= n && nj >= 1 && nj <= n){
add(dp[ni][nj][k+1][1][1],val);
}
add(dp[ni][nj][k][0][o2],val);
}
}
}
}
}
}
int ans = 0;
for(int i = 0; i <= n - K; ++i){
int v = 1ll * dp[n+1][n+1][i][0][0] * fac[n-K-i] % mod;
if(i & 1) add(ans,mod-v);
else add(ans,v);
}
printf("%d\n",ans);
return 0;
}
原文:https://www.cnblogs.com/y-dove/p/14758068.html