Problem G: qwb去面试
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1524 Solved: 231
[ Submit][ Status][ Web Board]
Description
某一天,qwb去WCfun面试,面试官问了他一个问题:把一个正整数n拆分成若干个正整数的和,请求出这些数乘积的最大值。
qwb比较猥琐,借故上厕所偷偷上网求助,聪明的你能帮助他吗?
qwb比较猥琐,借故上厕所偷偷上网求助,聪明的你能帮助他吗?
Input
第一行为一个正整数T.(T<=100000)
接下来T行,每行一个正整数n(n<=1e9),意义如题目所述。
接下来T行,每行一个正整数n(n<=1e9),意义如题目所述。
Output
每一行输出一个整数,表示乘积的最大值,由于答案可能很大,请将答案对109+7取模后输出。
Sample Input
2
2
5
Sample Output
2
6
HINT
2=2
5=2+3
思路:
很显然,如果n是<=4的,那么答案就是n.
如果n>4;
我们分类讨论:
①N%3==0.那么很显然,我们将N拆分成若干个3即可。
②N%3==1.那么我们先拆出一个4,然后剩下部分拆成若干个3即可。
③N%3==2.那么我们先拆出一个2,然后剩下部分拆成若干个3即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll long long int
#define mod 1000000007
ll poww(ll a,ll b)
{
ll tmp=a%mod;
ll ans=1;
ll n=b;
while(n)
{
if(n%2==1)
{
ans=(ans*tmp)%mod;
n-=1;
}
else
{
tmp=(tmp*tmp)%mod;
n/=2;
}
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
if(n<=4)
{
printf("%lld\n",n);
continue;
}
if(n%3==0)
{
int cont=n/3;
printf("%lld\n",poww(3,cont));
}
if(n%3==1)
{
int cont=n/3-1;
ll ans=4;
ans*=poww(3,cont);
printf("%lld\n",ans%mod);
}
if(n%3==2)
{
int cont=n/3;
ll ans=2;
ans*=poww(3,cont);
printf("%lld\n",ans%mod);
}
}
}