EOJ 4329 数论+精度问题(长记性)

在这里插入图片描述

做到一题卡精度比较严的题,一直以为是思路问题,最后发现是精度卡的比较死,题目不难。一个长记性的题,当考虑到精度问题时候,一定要考虑到底,不然思路正确,精度无法通过,就是 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;
}

题目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值