Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "bits/stdc++.h"
- using namespace std;
- #define int long long
- #define pb push_back
- #define mp make_pair
- #define vi vector<int>
- #define vb vector<bool>
- #define pii pair<int,int>
- #define mii map<int,int>
- #define all(c) c.begin(), c.end()
- #define rall(c) c.rbegin(), c.rend()
- #define tr(container, it) for(typeof(container.begin()) it = container.begin(); it != container.end(); it++)
- #define gcd(a,b) __gcd(a,b)
- #define lcm(a,b) (x/gcd(x,y))*y
- #define inf (long long) 1e18
- #define neg_inf (long long) (-1*1e18)
- #define F first
- #define S second
- #define sz(x) ((int)(x).size())
- #define rep(i,n) for(int i=0;i<n;i++)
- #define repd(i,n) for(int i=n-1;i>=0;i--)
- #define rep1(i,n) for(int i=1;i<=n;i++)
- #define deb(x) cout << #x << "=" << x <<"\n";
- const int N = 1e9 + 7;
- int pow(int x, int y) { int res = 1; while (y > 0) { if (y & 1) res = ((res) * (x)); res %= N; y = y >> 1; x = ((x) * (x)); } return res; }
- int pow(int x, int y, int p) { int res = 1; x = x % p; while (y > 0) {if (y & 1) res = (res * x) % p; y = y >> 1; x = (x * x) % p;} return res; }
- unsigned long long power(unsigned long long x,
- int y, int p)
- {
- unsigned long long res = 1; // Initialize result
- x = x % p; // Update x if it is more than or
- while (y > 0) {
- if (y & 1)
- res = (res * x) % p;
- y = y >> 1; // y = y/2
- x = (x * x) % p;
- }
- return res;
- }
- unsigned long long modInverse(unsigned long long n, int p)
- {
- return power(n, p - 2, p);
- }
- unsigned long long nCrModPFermat(unsigned long long n,
- int r, int p)
- {
- if (r == 0)
- return 1;
- unsigned long long fac[n + 1];
- fac[0] = 1;
- for (int i = 1; i <= n; i++)
- fac[i] = (fac[i - 1] * i) % p;
- return (fac[n] * modInverse(fac[r], p) % p * modInverse(fac[n - r], p) % p) % p;
- }
- void solve()
- {
- int n,m;
- cin>>n>>m;
- map<int,int> mm;
- rep(i,n-1)
- {
- int a;
- cin>>a;
- mm[a]++;
- }
- mm[0]=1;
- int srk=0;
- if(sz(mm)==(*mm.rbegin()).F+1)
- {
- vector<int> kk;
- for(auto x:mm)
- {
- kk.pb(x.S);
- }
- int ans=1;
- for(int i=1;i<sz(kk);i++)
- {
- srk+=(kk[i]*(kk[i]-1))/2;
- srk%=N;
- ans*=pow(kk[i-1],kk[i],N);
- ans%=N;
- }
- if(srk>=(m-(n-1)))
- ans*=nCrModPFermat(srk,m-(n-1),N);
- else
- {
- cout<<0<<"\n";
- return;
- }
- ans%=N;
- cout<<ans<<"\n";
- }
- else
- {
- cout<<0<<"\n";
- }
- }
- int32_t main()
- {
- // #ifndef ONLINE_JUDGE
- // freopen("gymnastics.in", "r", stdin);
- // freopen("gymnastics.out", "w", stdout);
- // #endif
- ios_base::sync_with_stdio(false);
- cin.tie(NULL);
- cout.tie(NULL);
- int t=1;
- cin>>t;
- while(t--)
- {
- solve();
- }
- }
- //code by-Roshan
- //unnecessary
- // bool cmp(pair<int,int> &a,pair<int,int> &b)
- // {
- // if(a.F==b.F)
- // return (a.S<b.S);
- // else
- // return (a.F<b.F);
- // //< =chota wala pehle
- // //> =chota wala baad me
- // }
- //better use this structure
- // struct s{
- // int a;
- // bool operator <(const s &x) const
- // {
- // return (a>x.a);
- // }
- // };
- // priority_queue<int,vector<int>,greater<>> p;
- // (priority queue as min heap)
- //important to use this one
- // cout<<fixed<<setprecision(3)<<x<<" ";
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement