[BZOJ]2751: [HAOI2012]容易题(easy) 暴力+快速幂

来源:互联网 发布:网络优化大师.apk 编辑:程序博客网 时间:2024/05/29 14:27

Description

为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!

题解:

能mod就mod,有减法就转正。

代码:

#include<bits/stdc++.h>using namespace std;#define LL long longconst int Maxn=100010;const LL mod=1000000007;int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}    return x*f;}int n,m,k,h;struct A{int pos,x;}a[Maxn];bool cmp(A a,A b){return (a.pos!=b.pos)?a.pos<b.pos:a.x<b.x;}map<int,bool>mark;LL Pow(LL x,int y){    if(!y)return 1;    if(y==1)return x%mod;    LL t=Pow(x,y>>1),ans=t*t%mod;    if(y&1)ans=ans*x%mod;    return ans;}int main(){    n=read();h=m=read();k=read();    for(int i=1;i<=k;i++)    {        a[i].pos=read();a[i].x=read();        if(!mark[a[i].pos])mark[a[i].pos]=true,h--;    }    LL sum=((1LL+n)*n/2LL)%mod,now=1,ans=Pow(sum,h);    sort(a+1,a+1+k,cmp);    a[0].pos=a[k+1].pos=0;    for(int i=1;i<=k+1;i++)    {        if(a[i].pos!=a[i-1].pos)        {            ans=ans*now%mod;            now=(sum-(LL)(a[i].x)+mod)%mod;        }        else if(a[i].x!=a[i-1].x)now=(now-a[i].x+mod)%mod;    }    printf("%lld",ans);}
原创粉丝点击