[HAOI2012] 容易題
阿新 • • 發佈:2018-04-15
sca scan pen int turn namespace .... n) print
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] 容易題