bzoj2751
2015-12-02 14:38
246 查看
答案显然是这个
View Code
Submit: 1436 Solved: 616
[Submit][Status][Discuss]
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!
接下来k行,每行两个正整数x,y表示A[x]的值不能是y。
1 1
1 1
2 2
2 3
4 3
样例解释
A[1]不能取1
A[2]不能去2、3
A[4]不能取3
所以可能的数列有以下12种
数列 积
2 1 1 1 2
2 1 1 2 4
2 1 2 1 4
2 1 2 2 8
2 1 3 1 6
2 1 3 2 12
3 1 1 1 3
3 1 1 2 6
3 1 2 1 6
3 1 2 2 12
3 1 3 1 9
3 1 3 2 18
30%的数据n<=4,m<=10,k<=10
另有20%的数据k=0
70%的数据n<=1000,m<=1000,k<=1000
100%的数据 n<=109,m<=109,k<=105,1<=y<=n,1<=x<=m
#include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<ctime> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #define rep(i,l,r) for(int i=(l);i<(r);i++) #define clr(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int,int> pii; #define mkp(a,b) make_pair(a,b) int read(){ int ans=0,f=1; char c=getchar(); while(!isdigit(c)){ if(c=='-') f=-1; c=getchar(); } while(isdigit(c)){ ans=ans*10+c-'0'; c=getchar(); } return ans*f; } const int maxk=100009; const ll mod=1000000007; int pre,cnt,n,m,k; ll s,t,ans=1; pii x[maxk]; ll power(ll a,ll b){ ll ans=1; while(b){ if(b&1) ans=ans*a%mod; a=a*a%mod; b>>=1; } return ans; } int main(){ n=read();m=read();k=read(); rep(i,1,k+1){ x[i].first=read();x[i].second=read(); } sort(x+1,x+k+1);k=unique(x+1,x+k+1)-x-1; s=ll(n)*(n+1)/2ll%mod; rep(i,1,k+1){ if(x[i].first==pre) t+=x[i].second; else{ cnt++;if(t) ans=ans*(((s-t)%mod+mod)%mod)%mod;pre=x[i].first;t=x[i].second; } } if(t) ans=ans*(((s-t)%mod+mod)%mod)%mod; ans=ans*power(s,m-cnt)%mod; cout<<ans<<endl; return 0; }
View Code
2751: [HAOI2012]容易题(easy)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1436 Solved: 616
[Submit][Status][Discuss]
Description
为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!
Input
第一行三个整数n,m,k分别表示数列元素的取值范围,数列元素个数,以及已知的限制条数。接下来k行,每行两个正整数x,y表示A[x]的值不能是y。
Output
一行一个整数表示所有可能的数列的积的和对1000000007取模后的结果。如果一个合法的数列都没有,答案输出0。Sample Input
3 4 51 1
1 1
2 2
2 3
4 3
Sample Output
90样例解释
A[1]不能取1
A[2]不能去2、3
A[4]不能取3
所以可能的数列有以下12种
数列 积
2 1 1 1 2
2 1 1 2 4
2 1 2 1 4
2 1 2 2 8
2 1 3 1 6
2 1 3 2 12
3 1 1 1 3
3 1 1 2 6
3 1 2 1 6
3 1 2 2 12
3 1 3 1 9
3 1 3 2 18
HINT
数据范围30%的数据n<=4,m<=10,k<=10
另有20%的数据k=0
70%的数据n<=1000,m<=1000,k<=1000
100%的数据 n<=109,m<=109,k<=105,1<=y<=n,1<=x<=m
Source
[Submit][Status][Discuss]相关文章推荐
- javascript 中的 delete
- 做linux运维工程师,必须要掌握以下几个工具
- 【LeetCode】190 Reverse Bits
- Jquery左右滑动插件之实现超级炫酷动画效果附源码下载
- IDEA中的单工程多模块(基于maven)
- Mileage Change Tested Yes via OBDSTAR X-100 Pro
- SAP OBYC自动记账的实例说明 +VALUE STRING
- 带你3步快速掌握iSCSI搭建
- maven pom.xml文件详解
- 设置背景的圆角,边框
- 扫描指定的包中的类上的注解,常用的注解有:
- Linq To DataTalbe 列X不属于表
- 安装fcitx [Crunch bang] [debian]
- 如何在旧的PHP系统中使用PHP 5.3之后的库
- 献给初学者:谈谈如何学习Linux操作系统
- QRFC的几个demo程序
- TRFC/QRFC
- 产销存报表直接在MB5B上取数
- 用 nodejs 写一个 cocos2dx-js 游戏自动更新版本的脚本
- Dlib机器学习库学习系列1----编译安装