题目描述
WP已经隐藏不了自己对
CZ的爱慕之情,终于在
11.10这天向
CZ表达了自己的爱意。
”请做我的好基友
,我愿意一辈子照顾你,我们在一起吧?
”。
CZ笑了笑说,我喜欢高智商的程序员,你能用程序实现我的一个问题我们就在一起。
题目描述如下:
给你n个数(1<= n <= 1000),这个n数的取值范围为[0,n - 1],问任意交换其中两个数所形成的的不同的序列有多少种?
机智的你一定可以帮你的好朋友解决他的终身大事的,加油…….
输入
输入一个数
n,
接下来输入
n
个数。
输出
序列有多少种
示例输入
10 6 6 5 6 5 7 2 5 5 4
示例输出
37
当交换的是相同的两个数时,序列是不会发生变化的,运用数学组合的知识可以得到:sum=C(N,2)-C(c1,2)-C(c2,2)-C(c3,2)-....,c1,c2,c3为给定的不同类中重复的个数,然后在最后输出时加一。
下面为AC代码:
#include <stdio.h> struct node { int kind; int count; }; int main() { struct node a[1000]; int n,i,j,k,num,sum; scanf("%d",&n); for(i=j=0;i<n;i++) { scanf("%d",&num); for(k=0;k<j;k++) if(a[k].kind==num) {a[k].count++;break;} if(k==j) { a[j].kind=num; a[j].count=1; j++; } } sum=n*(n-1)/2; for(i=0;i<j;i++) if(a[i].count>=2) sum-=a[i].count*(a[i].count-1)/2; printf("%d\n",sum+1); return 0; }