其他分享
首页 > 其他分享> > 2116: 简简单单的数学题(快速幂||爆longlong处理)

2116: 简简单单的数学题(快速幂||爆longlong处理)

作者:互联网

懒得打字的yzj丢了道简单的数学题。 ⌊a⌋ +⌈b⌉+c(四舍五入)+d^n; (d^n表示d的n次方)。 解释一下 就是a向下取整 b向上取整 c四舍五入的和加上d的n次方

输入

第一行3个数 a,b,c。0<a,b,c<1e18,
第二行一个数q 表示q次查询 q<=2e5
每次查询2个整数 d,n。 0<d,n<1e18;

输出

每次查询输出一个答案(取模1e12);

样例输入

1.9 2.1 2.2
1
2 2

样例输出

10

爆longlong三种处理方式

1.__int128 此类型只能在Linux上编译,本地编译不了,但可ac

2.将1e12的数分开乘

快速版本:
乘法优化成两部分:
大于1e6以及小于1e6的分开
p=1e6;
(((x*(y/p))%mod)*p)%mod+(x*(y%p))%mod;

龟速版本:
化成对应二进制一位一位的乘(此题tle)

ll ans = 0;
    while(b) {
        if(b & 1) ans = (ans + a ) ;
        if(ans>mod) ans%=mod;
        b >>= 1;
        a<<=1;
        if(a>mod) a%=mod;
    }

3.转化成long double(最强)
在这里插入图片描述

简化:
(x*y-(ll)((long double)x*y/mod)*mod+mod)%mod;
#include<bits/stdc++.h>
#define fi first
#define se second
#define log2(a) log(n)/log(2)
#define show(a) cout<<a<<endl;
#define show2(a,b) cout<<a<<" "<<b<<endl;
#define show3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl;
#define tim printf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
using namespace std;

typedef long long ll;
typedef pair<ll, ll> P;
typedef pair<P, ll> LP;
const ll inf = 0x3f3f3f3f;
const int N = 1e5;
const ll mod = 1e12;
const ll p=1e6;
const int base=131;
const double pi=acos(-1);

ll mul(ll x,ll y)
{
	return (x*y-(ll)((long double)x*y/mod)*mod+mod)%mod;
}


ll ksm(ll a, ll b) {
	ll res = 1;
	ll base = a%mod;
	while(b) {
		if(b & 1) res = mul(res, base) ;
		base = mul(base, base) ;
		b >>= 1;
	}
	return res;
}

int main()
{
	long double a,b,c;
	scanf("%Lf%Lf%Lf",&a,&b,&c);
	ll x=ceil(a),y=floor(b),z=(ll)(c+0.5);
	int t;
	scanf("%d",&t);
	ll res=x+y+z;
	if(res>mod) res%=mod;
	ll p,q;
	while(t--)
	{

		scanf("%lld%lld",&p,&q);
		ll ans=res+ksm(p,q);
		if(ans>mod) ans%=mod;
		printf("%lld\n",ans);
	}

}

标签:longlong,const,res,ll,base,ans,数学题,2116,mod
来源: https://blog.csdn.net/weixin_42640692/article/details/90579703