http://icpc.upc.edu.cn/problem.php?cid=1723&pid=1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll n,t,i,m,ans,a[100],inv[100],b[100];
const ll p=998244353;
ll ksm(ll a,ll b)
{
ll k=1;
while (b)
{
if (b&1)
{
k=k*a%p;
}
b=b>>1;
a=a*a%p;
}
return k;
}
int main()
{
scanf("%lld",&t);
while (t--)
{
ans=1;
scanf("%lld",&m);
for (i=1; i<=m; i++)
{
scanf("%lld%lld",&a[i],&b[i]);
ans=(ans*(((b[i]+1)%p*ksm(a[i],b[i])%p)%p-(b[i]%p*ksm(a[i],b[i]-1)%p)%p+p)%p)%p;
}
printf("%lld\n",ans);
}
}
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll n,t,i,m,ans,a[100],inv[100],b[100];
const ll p=998244353;
ll ksm(ll a,ll b)
{
ll k=1;
while (b)
{
if (b&1)
{
k=k*a%p;
}
b=b>>1;
a=a*a%p;
}
return k;
}
void dfs(ll i,ll k)
{
if (i==m+1)
{
ans=(ans+k)%p;
return;
}
dfs(i+1,k*(a[i]-1)%p*b[i]%p*inv[i]%p);
dfs(i+1,k);
}
int main()
{
scanf("%d",&t);
while (t--)
{
ans=0;
n=1;
scanf("%d",&m);
for (i=1; i<=m; i++)
{
scanf("%d%d",&a[i],&b[i]);
n=n*ksm(a[i],b[i])%p;
inv[i]=ksm(a[i],p-2)%p;
}
dfs(1,n);
printf("%d\n",ans);
}
}