题意:小
x +表示把此时序列中第个数 和第 个数 合并为一个数,值为 。 x *表示把此时序列中第个数 和第 个数 合并为一个数,值为 。
假设某个时刻序列中元素的个数为
模拟大法好!!
首先看到
我们易知,当
当
先做加法再做乘法一定比先做乘法在做加法更优。
证明:
所以题意可以转化为:将序列拆成若干个正整数的和,最大化其乘积。
容易发现,当拆分的数中,如果有一个数
又因为不会拆分出
又因为
那么对于
-
如果
,那么答案为 ; -
如果
,那么可以拆分成为 和 ,很明显前式 后式(拆分出 肯定不优),所以答案为 ; -
如果
,那么答案为 。
随后快速幂直接解决(注意开 long long)。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,mod=1e9+7;
long long power(long long a,long long b,long long p)
{
long long ans=1%p;
for(;b;b>>=1)
{
if(b&1)
ans=ans*a%p;
a=a*a%p;
}
return ans%p;
}
int main()
{
scanf("%lld",&n);
if(n<=4)
printf("%lld\n",n);
else
{
if(n%3==0)
printf("%lld",power(3,n/3,mod));
else if(n%3==1)
printf("%lld",4%mod*power(3,(n-4)/3,mod)%mod);
else
printf("%lld",2%mod*power(3,(n-2)/3,mod)%mod);
}
return 0;
}