链接:https://ac.nowcoder.com/acm/contest/342/B
来源:牛客网
题目描述
筱玛是一个快乐的男孩子。
筱玛在一次数学考试中看到了这样一道题:
求有多少个长度为 n 的不同的排列 A,满足对于任意的 i 均有 A[A[i]] + i = n + 1。
聪明的筱玛当然一眼就秒掉了这道题,现在他想来考考你。
输入描述:
一行一个整数 n。
输出描述:
一行一个整数,表示模 998244353 意义下的答案。
示例1
输入
复制
4
输出
复制
2
说明
3 1 4 2
2 4 1 3
只有以上这两个合法的排列 A。
备注:
1 ≤ n ≤ 106
这道题我也是很无语了。
打表之后瞎猜了个结论。是没问题的。但是n==1的时候我输出的是0,应该是1.
啊啊啊啊啊啊啊。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1000000+100;
const LL mod=998244353;
int lala(int k){
if((k-1)%4==1||(k-1)%4==2)
return 0;
else{
int pp;
if((k-1)%4==0)
pp=(k-1)/4;
else{
pp=(k-1)/4+1;
}
LL d=2;
LL sum=2;
for(int i=2;i<=pp;i++){
d=d+4;
d%=mod;
sum=sum*d;
sum%=mod;
}
return sum;
}
}
int main()
{
int n,m;
while(scanf("%d",&n)!=EOF){
if(n==2)
m=0;
else if(n==1)
m=1;
else{
m=lala(n);
}
printf("%d\n",m);
}
return 0;
}
打表代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1000000+100;
const LL mod=998244353;
int b[maxn];
int n;
int judge(int i){
int haha=b[i];
if(b[haha]+i!=n+1)
return 0;
else
return 1;
}
int main()
{
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++){
b[i]=i;
}
int num=0;
int xpp;
while(next_permutation(b+1,b+1+n)){
xpp=0;
for(int i=1;i<=n;i++){
if(judge(i))
{
xpp++;
}
else
break;
}
if(xpp==n)
{num++;
for(int j=1;j<=n;j++){
cout<<b[j]<<" ";
}
cout<<endl;
}
}
cout<<n<<":"<<num<<endl;
}
}