您的位置:首页 > 其它

周赛一 ACdream 1199 排列组合

2015-09-07 20:20 302 查看
Description

There are n swords of different weights Wiand n heros ofpower
Pi.

Your task is to find out how many ways the heros can carry the swords so that each hero carries exactly one sword.



Here are some rules:

(1) Every sword is carried by one hero and a hero cannot carry a sword whose weight is larger than his power.
(2) Two ways will be considered different if at least one hero carries a different sword.

Input

The first line of the input gives the number of test cases T(1 ≤ T ≤ 50).

Each case starts with a line containing an integer n (1 ≤ n ≤ 105)
denoting the number of heros and swords.

The next line contains n space separated distinct integers denoting the weight of swords.

The next line contains n space separated distinct integers denoting the power for the heros.

The weights and the powers lie in the range [1, 109].

Output

For each case, output one line containing "Case #x: " followed by the number of ways those heros can carry the swords.

This number can be very big. So print the result modulo 1000 000 007.

Sample Input

3
5
1 2 3 4 5
1 2 3 4 5
2
1 3
2 2
3
2 3 4
6 3 5


Sample Output

Case #1: 1
Case #2: 0
Case #3: 4


#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>

using namespace std;

int p[100010];
int T,n;
int a[100010];
int main()
{
while(~scanf("%d",&T))
{
int Case=0;
while(T--)
{
Case++;
scanf("%d",&n);
for(int i=0; i<n; ++i)
scanf("%d",&a[i]);
for(int j=0; j<n; ++j)
scanf("%d",&p[j]);
sort(a,a+n);
sort(p,p+n);
long long sum=1;
int j=0;
for(int i=0;i<n;i++) //组合数 求排列组合的种类
{
while(j<n&&a[j]<=p[i])j++;
sum=sum*(j-i)%1000000007;
}
printf("Case #%d: %lld\n",Case,sum%1000000007);
}
}
}

/*
struct node
{
int power;
int num;
} p[100010];
int T,n;
int a[100010];
int cmp(node p1,node p2)
{
return p1.power<p2.power;
}
int main()
{
while(~scanf("%d",&T))
{
int Case=0;
while(T--)
{
Case++;
scanf("%d",&n);
for(int i=0; i<n; ++i)
scanf("%d",&a[i]);
for(int j=0; j<n; ++j)
{
scanf("%d",&p[j].power);
p[j].num=0;
}
sort(a,a+n);
sort(p,p+n,cmp);
int j=0;

for(int i=0; i<n; ++i)  //组合数
{
if(i==0)
{
for(; j<n; j++)
{
if(p[i].power>=a[j])
p[i].num++;
else
break;
}
}
else
{
if(p[i-1].power==p[i].power)
{
p[i].num=p[i-1].num-1;
}
else
{
p[i].num=p[i-1].num;
for(; j<n; j++)
{
if(p[i].power>=a[j])
p[i].num++;
else
{
p[i].num-=1;
break;
}
}
if(j==n)
p[i].num-=1;
}
}
}
long long int sum=1;
for(int i=0; i<n; i++)
{
sum*=p[i].num%1000000007;
sum%=1000000007;   //勿漏<span id="transmark"></span>
if(sum==0)
break;
}
printf("Case #%d: %lld\n",Case,sum%1000000007);
}
}
}
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: