Protoss and Zerg

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bingongzi/article/details/84895366

链接: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;
} 

猜你喜欢

转载自blog.csdn.net/bingongzi/article/details/84895366