做到一题卡精度比较严的题,一直以为是思路问题,最后发现是精度卡的比较死,题目不难。一个长记性的题,当考虑到精度问题时候,一定要考虑到底,不然思路正确,精度无法通过,就是 0。
因为 a,b,n <= 109,所以两者只要相乘必须取模,减小精度,这点必须考虑。
还有就是再次理解了 ksm 算法的含义,ksm 中的 a 值更替的目的是在 p 为奇数时,a 的值可以以某一个 2 的倍数形式乘上 res,达到在 2 的倍数范围内的一些次幂值的计算
#include<stdio.h> //https://acm.ecnu.edu.cn/contest/448/problem/A/ 题目(还可以用二项式定理分解来做)
typedef long long ll;
ll mod = 998244353;
struct shu{
ll a;
ll c;
};
struct shu A;
ll b,n;
struct shu ksc(struct shu A,struct shu A1){ //如果不过可能就是数据问题,尽可能每一步都取模
struct shu t;
t.a = A.a%mod*A1.a%mod + A.c%mod*A1.c%mod*b%mod; //10^9 * 10^9 > long long 可能会爆,所以要先取模
// t.a %= mod;
t.c = A.a%mod*A1.c%mod + A1.a%mod*A.c%mod;
// t.c %= mod;
return t;
}
struct shu ksm(){
struct shu res;
res.a = 1;
res.c = 0;
while(n){
if(n&1) res = ksc(res,A);
A = ksc(A,A);
n >>= 1;
}
return res;
}
int main()
{
A.c= 1;
scanf("%lld %lld %lld",&A.a,&b,&n);
struct shu t = ksm();
printf("%lld",2*t.a%mod);
return 0;
}