牛客等级之题N1(8.12场)小w的a=b问题

牛客等级之题N1(8.12场)小w的a=b问题

题目链接

题目描述

给你两个数组,一个 a [    ] a[\; ] a[] 数组,长度为n,另一个是 b [    ] b[\; ] b[] 数组,长度为m。
现在问你 ∏ i = 1 n a [ i ] ! \prod_{i=1}^{n}a[i]! i=1na[i]! 是否等于 ∏ i = 1 m b [ i ] ! \prod_{i=1}^{m}b[i]! i=1mb[i]!
其中 ∏ \prod 是连乘符,它表示n个元素的乘积。"!“为阶乘运算,表示小于等于该数所有正整数的积,并且规定0!=1。
我们认为阶乘运算”!“的优先级大于连乘运算” ∏ ∏ "。

输入描述:

第一行是一个正整数T, ( 1 ⩽ T ⩽ 2 ∗ 1 0 2 ) (1\leqslant T\leqslant2*10^{2} ) (1T2102)表示案例的数目
对于每组案例,第一行是两个正整数 n , m n,m n,m ( 1 ⩽ n , m ⩽ 1 0 5 ) (1\leqslant n,m\leqslant10^{5} ) (1n,m105)
接下来一行输入 n n n 个整数 a [ i ] a[i] a[i] ( 0 ⩽ a [ i ] ⩽ 1 0 5 ) (0\leqslant a[i]\leqslant10^{5} ) (0a[i]105)
接下来一行输入 m m m 个整数 b [ i ] b[i] b[i] ( 0 ⩽ b [ i ] ⩽ 1 0 5 ) (0\leqslant b[i]\leqslant10^{5} ) (0b[i]105)
保证 n , m n,m n,m 的总和不多于 2 ∗ 1 0 6 2*10^{6} 2106

输出描述:

对于每组案例,输出一行一个字符串,如果 ∏ i = 1 n a [ i ] ! \prod_{i=1}^{n}a[i]! i=1na[i]! 等于 ∏ i = 1 m b [ i ] ! \prod_{i=1}^{m}b[i]! i=1mb[i]!,请输出"equal"。
反之请输出"unequal"。

示例1

输入

3
2 1
5 3
6
4 6
4 2 3 0
2 3 2 2 1 3
3 4
5 6 7
3 4 5 6

输出

equal
equal
unequal

这题肯定是要取模的,关键在于取什么模数最好,个人建议取一个大素数,如果 WA 就多试几次,我试了 1 e 9 + 7 1e9+7 1e9+7 不行,换成 1 e 9 + 3 1e9+3 1e9+3 就过了,AC代码如下:

#include
using namespace std;
typedef long long ll;
const int N=1e5+5;
const ll mod=1e9+3;
ll f[N];
void init(){
    f[0]=1;
    for(ll i=1;i<N;i++) f[i]=f[i-1]*i%mod;
}
int main()
{
    init();
    int t,n,m,a,b;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        ll s1=1,s2=1;
        for(int i=0;i<n;i++){
            scanf("%d",&a);
            s1=s1*f[a]%mod;
        }
        for(int i=0;i<m;i++){
            scanf("%d",&b);
            s2=s2*f[b]%mod;
        }
        if(s1==s2) printf("equal\n");
        else printf("unequal\n");
    }
	return 0;
}

你可能感兴趣的:(数论,牛客)