链接:https://ac.nowcoder.com/acm/contest/303/H
来源:牛客网
题目描述
1v1,是星际争霸(StarCraft)中最常见的竞技模式。
tokitsukaze进行了n场1v1。在每一场的1v1中,她都有星灵(Protoss)和异虫(Zerg)两个种族可以选择,分别有a个单位和b个单位。因为tokitsukaze不太擅长玩人类(Terran),所以她肯定不会选择人类。
对于每一场1v1,玩家只能控制己方单位。也就是说,如果选择虫族,那么只能控制虫族单位,如果玩家选择星灵,那么只能控制星灵单位。
在n场1v1中,假设第i场,有ai个虫族单位,和bi个星灵单位。tokitsukaze可以在一场1v1中,任选一种种族进行游戏。如果选择了虫族,那么在这场游戏中,可以选择出兵1到ai个单位。那么同理,如果选择了星灵,那么在这场游戏中,可以选择出兵1到bi个单位。
假设所有异虫单位互不相同,所有星灵单位也互不相同,那么请问tokitsukaze打完这n场1v1,出兵的总方案数是多少,由于答案很大,所以输出答案mod 998244353 后的结果。
注意:若两个方案,有其中一个单位不同,即视为不相同。
输入描述:
第一行包含一个T(T≤10),表示T组数据。
对于每组数据:
第一行包含一个正整数n(1≤n≤100000)。
接下来n行,第i行包含两个整数ai,bi(1≤ai,bi≤10^9),表示第i场1v1,有ai个异虫单位,和bi个星灵单位。
输出描述:
对于每组数据,输出一行,表示mod 998244353后的答案。
示例1
输入
复制
1
2
1 2
2 1
输出
复制
16
说明
第一组样例:
对于第一场对局,tokitsukaze可以选择的虫族兵种有一个,并且将其编号为1,tokitsukaze可以选择的星灵兵种有两个,将其编号为1,2。所以tokitsukaze有四种可供选择的游戏方案:
1、选择虫族,并且派出虫族1号兵种。
2、选择星灵族,并且派出星灵族1号兵种。
3、选择星灵族,并且派出星灵族2号兵种。
4、选择星灵族,并且派出星灵族1,2号兵种。
对于第二场对局,tokitsukaze可以选择的虫族兵种有两个,并且将其编号为1,2,tokitsukaze可以选择的星灵兵种有一个,将其编号为1。所以tokitsukaze有四种可供选择的游戏方案:
1、选择虫族,并且派出虫族1号兵种。
2、选择虫族,并且派出虫族2号兵种。
3、选择虫族,并且派出虫族1,2号兵种。
4、选择星灵族,并且派出星灵族1号兵种。
两场对局是相互独立的事件,所以两轮游戏的出兵方案总数为4*4(mod 998244353)=16种。
分析:其实就是求2的a次方-1加上2的b次方-1之和,在不断重复相乘。注意:需用到快速幂函数。
代码如下:
#include<stdio.h>
#include<math.h>
#define inf 998244353
long long power(long a,long b)//快速幂函数
{
int ans=1;
while(b>0)
{
if(b%2==1)
ans=(ans*a)%inf;
b=b/2;
a=(a*a)%inf;
}
return ans;
}
int main()
{
int i,t,n,j;
long long a,b,s,s1,s2,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=1;
for(i=1;i<=n;i++)
{
scanf("%lld%lld",&a,&b);
s1=power(2,a);//2的a次方
s2=power(2,b);//2的b次方
s=(s1+s2)%inf-2;
sum=((sum%inf)*(s%inf))%inf;
}
printf("%lld\n",sum%inf);
}
return 0;
}