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