Protoss and Zerg(快速幂)

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值