zoukankan      html  css  js  c++  java
  • HDU

    题意:将一个数x拆成a1+a2+a3+……,ai不等于aj,求最大的a1*a2*a3*……。

    分析:

    1、预处理前缀和前缀积,因为拆成1对乘积没有贡献,所以从2开始拆起。

    2、找到一个id,使得2+3+4+……+id - 1(sum[id-1]) < x < 2+3+4+……+id(sum[id)。(二分找即可)

    则rest = x - sum[id - 1]。将rest分配给2+3+4+id-1中的某个数。

    3、在保证数字不重复的前提下,分配给的那个数越小越好,证明见4。

    因此,应该分配给的数为id-rest。但是在id-rest小于2时,那还应该分配给2,2是可以分配的数字中最小的数字。

    假设分配给4,那么最后的结果中,mul[id-1]应除以4(把4去掉),然后再乘上(4+rest)。

    4、证明:设tmp=2*3*4*……*(id - 1)。

    假设既可分配给4,也可分配给5的情况下,

    将rest分配给4:设tmp=4*t1,则ans1=(4+rest)*t1,

    将rest分配给5:设tmp=5*t2,则ans2=(5+rest)*t2,

    因为t1>t2,所以ans1>ans2,得证。

    5、PS:2为偶数,3为奇数,2x+3y可以表示大于1的所有正整数,3最多的时候最优。

    6、逆元

    1、除法取模要用逆元。

    遇到(a/b)%mod这种情况,应转化成(a*k)%mod,k即为a在mod下的逆元。

    2、递推求逆元

    inv[1]=1
    for(i=2;i<n;i++)
    inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD
    

    3、定义:

    若a*b=1(mod MOD)则称作b是a在模MOD下的逆元。记作a^-1=b(mod m)

    4、性质: a^-1=b(mod MOD)时
    b^-1=a(mod MOD)
    a*b=1(mod MOD),即a*b=MOD*x+1.
    a^-1=b+k*MOD(mod MOD)
    MOD/a=MOD*b(mod MOD)
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int MAXN = 100000 + 10;
    typedef long long LL;
    LL sum[MAXN], mul[MAXN], inv[MAXN];
    const LL MOD = 1e9 + 7;
    void init(){
        sum[1] = 0, mul[1] = 1, inv[1] = 1;
        for(int i = 2; i < MAXN; ++i){
            sum[i] = sum[i - 1] + i;
            mul[i] = ((mul[i - 1] % MOD) * (i % MOD)) % MOD;
            inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
        }
    }
    int main(){
        int T;
        scanf("%d", &T);
        init();
        while(T--){
            LL x;
            scanf("%lld", &x);
            if(x == 1){
                printf("1
    ");
                continue;
            }
            int id = lower_bound(sum + 2, sum + MAXN, x) - sum;
            if(sum[id] == x){
                printf("%lld
    ", mul[id]);
                continue;
            }
            --id;
            LL rest = x - sum[id];
            LL ans;
            if(2 + rest > id){
                ans = ((mul[id] * inv[2]) % MOD * (2 + rest)) % MOD;
            }
            else{
                ans = ((mul[id] * inv[id + 1 - rest]) % MOD * (id + 1)) % MOD;
            }
            printf("%lld
    ", ans % MOD);
        }
        return 0;
    }
    

      

  • 相关阅读:
    分页查询
    web 开发中 405报错
    html 中input标签的name属性
    怎么样利用debug
    bzoj 1314: River过河 优先队列
    bzoj 4004: [JLOI2015]装备购买 拟阵 && 高消
    bzoj 1133: [POI2009]Kon dp
    bzoj 4127: Abs 树链剖分
    bzoj 2406: 矩阵 上下界网络流判定
    再写FFT模板
  • 原文地址:https://www.cnblogs.com/tyty-Somnuspoppy/p/6876132.html
Copyright © 2011-2022 走看看