签到 HDU - 7004 (快速幂)

给 a,ba,b ,每次 a,ba,b 会变为 a+b,a−ba+b,a−b ,问 kk 次之后变成了哪两个数,对 998244353998244353 取模,多组数据。

Input

第一行一个正整数 T(1≤T≤100000)T(1≤T≤100000) ,代表测试组数。 

接下来 TT 行每行三个数 a,b,k(0≤a,b<998244353,0≤k≤109)a,b,k(0≤a,b<998244353,0≤k≤109) 。

Output

TT 行每行两个整数,代表每一组数据 a,ba,b 最后变成了什么。

Sample Input

2
2 1 5
5 5 100

Sample Output

12 4
329904920 329904920
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
const int mod=998244353;
long long kpow(long long m,long long n)
{

	long long r=1;
	while(n)
	{
		if(n%2) r=r*m%mod;
		m=m*m%mod;
		n/=2;
	}
	return r;
}
int main()
{
	long long n,m,j,i,k,a,w,b,a1,b1;
	scanf("%lld",&w);
	while(w--)
	{
		scanf("%lld%lld%lld",&a,&b,&k);
		n=(k+1)/2-1;
		if(k%2)
		{
			a1=kpow(2,n)*(a+b)%mod;
			b1=kpow(2,n)*(a-b+mod)%mod;/*负数求模*/
		}
		else
		{
			a1=2*kpow(2,n)*a%mod;
			b1=2*kpow(2,n)*b%mod;
		}
		printf("%lld %lld\n",a1,b1);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值