思路是总的排列减去本身减去存在位置重合的情况只有15分
信封问题
题目描述
某人写了 n 封信和 n 个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。
输入格式
一个信封数 n,保证 n≤20。
输出格式
一个整数,代表有多少种情况。
样例 #1
样例输入 #1
2
样例输出 #1
1
样例 #2
样例输入 #2
3
样例输出 #2
2
提示
对于 100% 的数据,1≤n≤20。
#include<bits/stdc++.h>
using namespace std;
int ans,a[25],b[25],s=1;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
a[i]=i;
b[i]=a[i];
}
for(int i=n;i>=1;i--)
{
s=s*i;
}
while(next_permutation(a+1,a+n+1))
{
for(int i=1;i<=n;i++)
{
if(a[i]==b[i])
{
ans++;
}
}
}
cout<<s-ans-1;
}