码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #167 (Div. 1)B

时间:2015-05-08 22:03:42      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

//对x从小到大排序
//开一个数组equal,存入一段相同的x的值
//那么ans = equal[1]! * equal[2]! ....
//然后在除以没一段相同x中的y相同的数的阶乘
//由题意可知,开(xi == xj),(yi == yj)的最多只有两个
//可以记录下(xi == xj) ,(yi == yj)的对数,
//在计算的时候可以对偶数除2就行
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std ;
const int maxn  = 200010 ;
typedef __int64 ll ;
struct node
{
    int x ,y;
}a[maxn] ;
bool cmp(struct node a ,struct node b)
{
    if(a.x == b.x)
    return a.y < b.y;
    return a.x < b.x;
}
int equal_x[maxn] ;
int main()
{
    int n ,m ;
    while(~scanf("%d" ,&n))
    {
        for(int i = 1;i <= 2*n ;i++)
        {
            scanf("%d" ,&a[i].x) ;
            a[i].y = i%n;
        }
        scanf("%d" ,&m) ;
        sort(a+1 ,a+1+2*n , cmp);
        int len_x = 0 ,len_y = 0;
        for(int i = 1;i <= 2*n ;i++)
        {
            if(a[i].x == a[i-1].x)
            {
                if(a[i].y == a[i-1].y)
                len_y++ ;
                equal_x[len_x]++;
                if(i == 2*n) len_x++;
            }
            else  len_x++;
        }
        ll ans = 1;
        for(int i = 0;i < len_x;i++)
        {
            for(int j = 1;j <= equal_x[i] ;j++)
            {
                if(len_y &&(j+1)%2 == 0)
                {
                    ans = (ans * (ll)((j+1)/2)) % m;
                    len_y--;
                }
                else  ans = (ans * (ll)(j+1)) % m;
            }
        }
        printf("%I64d\n" ,ans) ;
    }
    return 0;
}


























Codeforces Round #167 (Div. 1)B

标签:

原文地址:http://blog.csdn.net/cq_pf/article/details/45585515

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!