1.题目引入:
给 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 最后变成了什么。
2.样例输出:
Sample Input
2 2 1 5 5 5 100
Sample Output
12 4 329904920 329904920
原理:
(a*b)%mod=((a%mod)*(b%mod))%mod;
如:s=1,n=3(表示以 3 为底), x=21(21 次方)
s n x
3 3^2 10
3 3^4 5
3^5 3^8 2
3^5 3^16 1
3^21 3^32 0
显然将3^21=3*3^4*3^16
3.代码如下:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int mod=998244353; long long dfs(long long x) { long long s=1,n=2; while(x) { //if(x&1) if(x%2) s=s*n%mod; n=n*n%mod; x/=2; //x>>=2 } return s; } int main() { int t; cin>>t; while(t--) { long long a,b,k,c; cin>>a>>b>>k; long long s,s1,ans,ans1; s=((dfs(k/2))*a%mod)%mod; s1=((dfs(k/2))*b%mod)%mod; ans=(s+s1+mod)%mod; ans1=((s-s1)+mod)%mod; if(k%2) { cout<<ans<<" "<<ans1<<endl; } else { cout<<s<<" "<<s1<<endl; } } return 0; }