给一个数字,把他分成若干份,求乘积最大

原理即是要尽量多的弄出3

#include 
#include"cstdio"
using namespace std;
long long quick(long long a,long long b,long long c)
{
    long long ans=1;
    a=a%c;
    while(b>0)
    {
        if(b%2==1)
            ans=(ans*a)%c;
        b=b/2;
        a=(a*a)%c;
    }
    return (long long)ans;
}
int main()
{

    int t,i;
    long long k;
    scanf("%d",&t);
    for(i=0;iscanf("%lld",&k);
        if(k==1){
            printf("1\n");
            continue;
        }
        if(k%3==1) printf("%lld\n",(4*quick(3,(k-4)/3,1000000007))%1000000007);
        if(k%3==2) printf("%lld\n",(2*quick(3,(k-2)/3,1000000007))%1000000007);
        if(k%3==0) printf("%lld\n",quick(3,k/3,1000000007));
    }
    return 0;
}

错误原因:没想到快速幂能解决那么大的数据(3的3000万次),递归的解决太麻烦而且不是很正确。

你可能感兴趣的:(数学专场,之江学院网络赛)