终于想明白了啊啊啊啊啊。不容易的啊啊啊啊啊啊。
明天再补题解:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353;
ll m,ans,n,a,all,j,k,p[30],q[30],tt[30];
ll fpow(ll n,ll k)//快速幂求n^k
{
ll res=1;
n=n%mod;
while(k>0)
{
if(k&1)
res=res*n%mod;
n=n*n%mod;
k>>=1;
}
return res;
}
void init(int m)//不进行此预处理也会超时
{
for(int k=1;k<=m;k++)//tt[i]数因子p[i]的贡献
{
tt[k]=q[k]*(p[k]-1)%mod*fpow(p[k],mod-2)%mod;
}
}
void dfs(int step,ll tmp)//枚举p[step]的状态
{
if(step>m)
{
ans=(ans+n*tmp)%mod;
return;
}
dfs(step+1,tmp*tt[step]%mod);
dfs(step+1,tmp);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&m);
n=1;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&p[i],&q[i]);
n=n*fpow(p[i],q[i])%mod;
}
init(m);
ans=0;
dfs(1,1);
//ans=(ans+n)%mod;
printf("%lld\n",ans);
}
return 0;
}