链接:https://ac.nowcoder.com/acm/problem/15954
来源:牛客网
题意:
给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积最大是多少,结果对2000000000000000003(共有17 个零) 取模
思路:
一看到对2e18+3取模就想到了快速幂,但实际上稍微乘一下即使用 ull (
2
64
=
18446744073709551615
2^{64}=18446744073709551615
264=18446744073709551615)也会爆,没办法,只能拿出__int128来算了。。。。。。
但实际上循环乘3取模就行。。。。毕竟最大只有
3
2000
3
3^{\frac{2000}{3}}
332000,也不会超时
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
typedef __int128 int128;
const int maxn=1e3+10;
const ll mod=2000000000000000003;
ll t,s,ans;
//ll qpow(ll a,ll b) { //a的b次方不断对mod取模
// ll res = 1;
// for(int i=0;i<b;i++) res=res*a%mod;
// return res;
//}
ll qpow(ll a,ll b) { //快速幂模板
int128 res = 1,base = a;
while(b) {
if(b&1) res = res*base%mod;
base = base*base%mod;
b >>= 1;
}
return res;
}
int main(){
cin>>t;
while(t--){
cin>>s;
if(s<=4) ans=s;
else{
if(s%3==0) ans=qpow(3,s/3);
else if(s%3==1) ans=qpow(3,s/3-1)*4%mod;
else ans=qpow(3,s/3)*2%mod;
}
cout<<ans<<endl;
}
}