公式化简 之后求出每个质因子对于答案的贡献度,先枚举出所有的因子,即枚举质因子相乘的情况,然后算出贡献度,分两次枚举,之后两次结果乘起来。
#include <iostream>
#include <stdio.h>
using namespace std;
const int N = 25;
const int mod = 998244353;
int p[N], invp[N], q[N];
typedef long long ll;
ll quick(ll a, ll b){
ll ans = 1;
while(b){
if(b&1) ans = ans * a %mod;
a = a*a%mod;
b >>= 1;
}
return ans;
}
int main()
{
int t;
cin >> t;
while(t --){
int n;
cin >> n;
ll ans0 = 1;
for(int i = 0; i < n ;i ++){
cin >> p[i] >> q[i];
ans0= ans0*quick(p[i], q[i])%mod;
}
for(int i = 0; i < n;i ++){
invp[i] = quick(p[i], mod - 2);
}
long long ans = 1;
long long vis = 1;
for(int i = 1; i < (1 << n/2); i ++){
ll flag = 1;
for(int j = 0; j < n/2; j ++){
if((i >> j)&1){
flag = flag *(p[j] - 1)%mod;
flag = flag*invp[j]%mod;
flag = flag*q[j]%mod;
}
}
ans = (ans + flag)%mod;
}
ll ans1 = 1;
for(int i = 1; i <= (1 << (n - n/2)) - 1; i ++){
ll flag = 1;
for(int j = 0; j < (n - n/2); j ++){
if((i >> j)&1){
flag = flag *(p[j + n/2] - 1)%mod;
flag = flag*invp[j + n/2]%mod;
flag = flag*q[j + n/2]%mod;
}
}
ans1 = (ans1 + flag)%mod;
}
ans = ans*ans1%mod;
cout << ans*ans0%mod <<endl;
}
}