欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简简单单的数学题

程序员文章站 2022-04-28 08:36:20
...

简简单单的数学题
法一:快速幂+__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";
    }
}