码迷,mamicode.com
首页 > 其他好文 > 详细

[HAOI2012] 容易题

时间:2018-04-15 18:50:08      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:algo   stream   div   lse   ==   family   printf   cstring   class   

  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] 容易题

标签:algo   stream   div   lse   ==   family   printf   cstring   class   

原文地址:https://www.cnblogs.com/qjs12/p/8848590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!