[HAOI2012] 容易题
Posted qjs12
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HAOI2012] 容易题相关的知识,希望对你有一定的参考价值。
70分蛮好想的,因该是用组合的知识理解吧,好像跟寒假学的生成函数有点关系?不过有关系也是最简单的。
然而这题剩下的30分真是......为什么我就没想到暴力算那105,之后快速幂求剩下的......
还是东西学的有点死,不过比起半年前真的好多了。
// q.c #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long LL; const int M=100000+10; const int mod=1000000007; struct Data { int x,y; bool operator < (const Data &A) const { if(x!=A.x) return x<A.x; return y<A.y; } }a[M],b[M],sum[M]; int poww(int a,int b) { int ans=1,base=a; while(b) { if(b&1) ans=((LL)ans*base)%mod; base=((LL)base*base)%mod; b>>=1; } return ans; } int n,m,k,cnt,cnt1; int main() { freopen("easy.in","r",stdin); freopen("easy.out","w",stdout); scanf("%d%d%d",&n,&m,&k); int base=(LL)(n+1)*n/2%mod; int ans=1; for(int i=1;i<=k;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a+1,a+k+1); for(int i=1;i<=k;i++) { if(a[i].x==b[cnt].x&&a[i].y==b[cnt].y) continue; b[++cnt].x=a[i].x,b[cnt].y=a[i].y; } for(int i=1;i<=cnt;i++) { if(b[i].x==sum[cnt1].x) sum[cnt1].y-=b[i].y; else sum[++cnt1].x=b[i].x,sum[cnt1].y=base-b[i].y; } for(int i=1;i<=cnt1;i++) ans=((LL)ans*((sum[i].y%mod+mod)%mod))%mod; ans=((LL)ans*poww(base,m-cnt1))%mod; printf("%d\n",ans); return 0; }
以上是关于[HAOI2012] 容易题的主要内容,如果未能解决你的问题,请参考以下文章