简简单单的数学题

博客介绍了大整数乘法的三种实现方法。一是快速幂加__int128,该类型在Linux的gcc编译器可用,但C99标准未提供;二是高精度方法,将乘法优化为大于和小于1e6两部分;三是使用long double类型,给出了简化公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
法一:快速幂+__int128

_int128 类型的数据是大整数类型,貌似只可以在Linux操作系统环境下的gcc编译器才可以使用,但是C99标准未提供,__int128 编译不给过,调试很费劲,但判题没问题,能过。

法二:(高精度)
乘法优化成两部分:大于1e6以及小于1e6的分开
p=1e6;

(((x*(y/p))%mod)p)%mod+(x(y%p))%mod;

法三:(longdouble):很强…
在这里插入图片描述

简化:
(xy-(ll)((long double)xy/mod)*mod+mod)%mod;

参考博客

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<iterator>
#include<queue>
#include<vector>
#include<string>
using namespace std;
 
typedef long long ll;
const int N=1e6+10;
const long long INF=1e18;
const double eps=0.0000001;
const ll mod=1e12;
 
ll Pow(ll a,ll b){
    __int128 res=1;
    __int128 base=a%mod;
    while(b){
        if(b&1)res=(res*base)%mod;
        base=(base*base)%mod;
        b>>=1;
    }
    return res;
}
int main()
{
   ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
   double a,b,c;
   ll k,d,n,ans;
   cin>>a>>b>>c;
   ll A=(ll)floor(a)%mod;
   ll B=(ll)ceil(b)%mod;
   ll C=(ll)floor(c+0.5)%mod;
    cin>>k;
    while(k--)
    {
        cin>>d>>n;
        ans=(((A+B)%mod+C)%mod+Pow(d,n))%mod;
        cout<<ans<<"\n";
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值