zoukankan      html  css  js  c++  java
  • [2018.12.30]BZOJ2751 [HAOI2012]容易题(easy)

    考虑一个一个加入限制。

    那么先算没有限的情况。

    根据乘法分配律,发现答案其实是([frac{n(n+1)}{2}]^m)

    也就是(m)((1+2+3+...+n))的积。将第(i)((1+2+3+...+n))记为(sum_i)(当然这只是(sum_i)的初值)。

    设目前答案为(ans)

    当加入一个限制条件(x y),就是从(sum_x)中删去(y),那么答案就减少了(frac{ans}{sum_x} imes y)(当然要求(y)还存在于(sum_x)中)。

    还发现其实我们只关心两次操作的(x)是否不同,而不关心具体值。

    所以我们开一个map来将(x)映射到([1,k])之间的整数上,记为(mp)。当然,没有出现的(x)可以不管。

    另外记一个Pair类型的map或者set,表示操作(x y)是否被执行过。

    code:

    #include<bits/stdc++.h>
    using namespace std;
    struct Pair{
        int a,b;
        bool operator >(Pair y)const{
            if(a!=y.a)return a>y.a;
            return b>y.b;
        }
        bool operator <(Pair y)const{
            if(a!=y.a)return a<y.a;
            return b<y.b;
        }
    };
    const long long mod=1e9+7;
    long long n,m,k,sum[100010],ans,v;
    int id,t,cnt;
    map<int,int>mp;
    map<Pair,bool>mp2;
    long long POW(long long x,long long y){
        long long tot=1;
        while(y){
            if(y&1)tot=tot*x%mod;
            x=x*x%mod;
            y>>=1;
        }
        return tot;
    }
    long long INV(long long x){
        return POW(x%mod,mod-2);
    }
    long long ch(long long x,long long y){
        return x%mod*INV(y)%mod;
    }
    int main(){
        scanf("%lld%lld%lld",&n,&m,&k);
        ans=POW(n*(n+1)/2%mod,m);
        for(int i=1;i<=k;i++)sum[i]=n*(n+1)/2;
        for(int i=1;i<=k;i++){
            scanf("%d%lld",&id,&v);
            t=mp[id];
            if(!t)t=mp[id]=++cnt;
            if(mp2[(Pair){t,(int)v}])continue;
            mp2[(Pair){t,(int)v}]=1;
            ans=(ans-ch(ans,sum[t])*v%mod+mod)%mod;
            sum[t]=(sum[t]-v+mod)%mod;
        }
        printf("%lld",ans);
        return 0;
    }
    
  • 相关阅读:
    java 求 1!+2!+3!+....+10!的和为
    Java 循环控制语句
    java for 循环 九九乘法表
    Java for 循环
    Java while 和 do...while
    Java if语句
    Java switch 语句
    java a++ 和 ++a 理解
    Java 自动转换和强制转换
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/xryjr233/p/BZOJ2751.html
Copyright © 2011-2022 走看看