给 a,b ,每次 a,b 会变为 a+b,a−b ,问 k 次之后变成了哪两个数,对 998244353 取模,多组数据。
Input
第一行一个正整数 T(1≤T≤100000) ,代表测试组数。
接下来 T 行每行三个数 a,b,k(0≤a,b<998244353,0≤k≤109) 。
Output
T 行每行两个整数,代表每一组数据 a,b 最后变成了什么。
Sample Input
2
2 1 5
5 5 100
Sample Output
12 4
329904920 329904920
题意
求k次变化后的a与b
思路
根据以上可以得出
当k为偶数时,变化后的结果为(2^ k/2)*a,( 2^k/2) *b
当k为奇数时,变化后的结果为(2^ k/2) * (a+b),(2^ k /2)*(a-b)
- List item
最后加上取余即可
But可能会有负数的结果,负数怎么取余呢?
负数取余就等于(负数+mod)%mod即可
代码
#include<bits/stdc++.h>
using namespace std;
int mod=998244353;
long long quickpow(long long x)
{
long long s=1,n=2;
while(x)
{
if(x%2)
s=s*n%mod;
n=n*n%mod;
x/=2;
}
return s;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long a,b,k,c;
scanf("%lld %lld %lld",&a,&b,&k);
long long s,s1,ans,ans1;
s=((quickpow(k/2)%mod)*a%mod)%mod;
s1=((quickpow(k/2)%mod)*b%mod)%mod;
ans=(s%mod+s1%mod+mod)%mod;
ans1=((s-s1)%mod+mod)%mod;
if(k%2)
printf("%lld %lld\n",ans,ans1);
else
printf("%lld %lld\n",s,s1);
}
return 0;
}