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
具体做法就是将3的1次方,3的10次方......3的100000000次方都算出来,然后直接找到每位的个数即可如3^(45421257)次方可以看成(3^400000000)*(3^50000000)*……*(3^7);(^表示次方)
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
long long int a[10];
a[0]=3;
for(int i=1;i<=9;i++)
{
a[i]=1;
for(int j=0;j<10;j++)
a[i]=a[i]*a[i-1]%1000000007;
}//打表
int m;
scanf("%d",&m);
while(m--)
{
int n;
scanf("%d",&n);
int s=n/3;
int l=n%3;
int h=1;
if(n>4)
{
if(l==1)
s=s-1,h=4;
else if(l==2)
h=2;
else
h=1;
long long g=1;
int i=0;
while(s)
{
int k=s%10;//k表示该位的数
if(k!=0)
{
long long r=1;
for(int p=0;p<k;p++)
r=r*a[i]%1000000007;
g=g*r%1000000007;
}
i++;
s=s/10;
}
g=g*h%1000000007;
printf("%lld\n",g);
}
else
printf("%d\n",n);
}
}