HDU 5646 DZY Loves Partition 数列

题意:给一个数n,把他分成k个正整数的和,且k个正整数不相同,问这k个正整数的乘积最大为多少,答案mod1e9.


想法:一个结论这k个数字越是接近那么他的乘积就越大,那么显然最小的连续k个数字是数列:1,2,3,,,k,那么n至少要分成这种情况,然后将这个数列整体扩大,如果有余数,那么这些数只要均匀的加到后面的余数个数上就好了,每一个加上1。


<span style="font-family:Arial;background-color: rgb(255, 255, 255);">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int node=1000000+5;
const int mod=1e9+7;
int a[node],b[node];
int main()
{
 int test;
 scanf("%d",&test);
 for(__int64 i=1;i<=1000000+5;i++)
 a[i]=i;
 while(test--)
 {
  __int64 n,k;
  scanf("%I64d%I64d",&n,&k);
  __int64 suma=(1+k)*k/2;
  if(suma>n) 
  {
   printf("-1\n");
   continue;
  }
  n-=suma;
  __int64 zf=n/k;
  __int64 yu=n%k;
  if(yu==0)
  {
   for(__int64 i=1;i<=k;i++) b[i]=a[i]+zf;
  }
  else
  {
   for(__int64 j=1;j<=k;j++) 
   {
    if(j<=k-yu) b[j]=a[j]+zf;
    else b[j]=a[j]+zf+1;
   } 
  }
  __int64 res=1;
  for(__int64 i=1;i<=k;i++)
  {
   res=res*b[i]%mod;
  }
  printf("%I64d\n",res);
 } 
 return 0;
}</span>



你可能感兴趣的:(HDU 5646 DZY Loves Partition 数列)