• hdu 5646 DZY Loves Partition


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5646

    题意:给出n和k,求把n拆成k个不同整数,且这些整数的乘积最大时的乘积,输出时对1e9+7取余。

    思路:要乘积最大,可以想到这些拆分成的数是连续的,或者中间隔一个的。先求出一段连续的整数的和与n的差最小,然后把还少的部分x加在前x大的数上去就可以了。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 //#include <bits/stdc++.h>
     5 using namespace std;
     6 int T;
     7 const long long mod = 1e9+7;
     8 int main() 
     9 {
    10     scanf("%d", &T);
    11     int n, k;
    12     while(T--)
    13     {
    14         scanf("%d%d", &n, &k);
    15         if(k >= 44721)
    16         {
    17             printf("-1
    "); continue;
    18         }
    19         long long sum = 1+k;
    20         sum *= k; sum /= 2;
    21         if(sum > n)
    22         {
    23             printf("-1
    "); continue;
    24         }
    25         n = n - sum;
    26         int l = n/k; int r = n%k;
    27         long long ans = 1;
    28         for(int i = 1; i <= k-r; i++)
    29         {
    30             ans = ans*(l+i)%mod;
    31         }
    32         for(int i = k; i > k-r; i--)
    33         {
    34             ans = ans*(l+i+1)%mod;
    35         }
    36         cout<<ans<<endl;
    37        
    38     }
    39     return 0;
    40 }
  • 相关阅读:
    oracle 触发器的编写
    单例类与常见双下方法
    实现高效率的冒泡排序
    面向对象基础(五)
    面向对象基础(四)
    面向对象基础(三)
    面向对象基础(二)
    面向对象(基础)
    四指针法
    因数法
  • 原文地址:https://www.cnblogs.com/titicia/p/5296360.html
Copyright © 2020-2023  润新知