题解:P15802 [GESP202603 七级] 拆分
lcliruiyan · · 题解
题目大意
给出
题目思路
::::info[一个比较基础的结论]{open} 当一些数的和一定时,每个数之间的差越小,这些数的乘积越大。
:::info[证明]
我们可以先证明只有两个数的情况。设
这是一个二次函数,由于二次项系数为负数,所以抛物线开口朝下。由于
接下来将结论推广到多个数的情况。设
所以整体乘积变大。 ::: ::::
因此,我们要让所有的
根据我在考场上大量的暴力输出尝试和推算,我找出来一个规律:当乘积最大时,
::::info[证明如下]{open}
我们先找一个
当
当
因此,
又因为
所以
若
那么就可以分三种情况讨论。
这样就能使
code
#include<bits/stdc++.h>
using namespace std;
#define int long long//不开long long见祖宗
const int mod=1e9;//别忘记取模!!!
int t,n;
int qpow(int a,int b)//快速幂
{
if(b==0)return 1;
if(b==1)return a;
int hf=qpow(a,b/2)%mod;
int sum=(hf*hf)%mod;
if(b%2==1)sum=(sum*a)%mod;
return sum;
}
signed main()
{
cin>>t;
while(t--)
{
cin>>n;
if(n<=3)cout<<n<<endl;//n=1,2,3时都不能再拆
else
{
if(n%3==0)cout<<qpow(3,n/3)<<endl;
if(n%3==1)cout<<(4*qpow(3,(n-4)/3))%mod<<endl;
if(n%3==2)cout<<(2*qpow(3,(n-2)/3))%mod<<endl;
}
}
return 0;
}
其实本蒟蒻是在考场上暴力输出然后瞪眼瞪出来的。