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

BZOJ 2751 [HAOI2012]容易题 数学

时间:2015-05-11 09:02:54      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:容易题   bzoj   数学   数据   瞎搞   

题意链接

方法:数学+瞎搞(注意取模问题)

解析:这题其实也没啥好说的,随便写写就出来了,我就直接挂几个过程。a[i].n表示第i位第n种取值。

a[1].1?a[2].1?...?a[n].1+

a[1].1?...?a[n].2+...+

a[1].1?...?a[n].x

=

a[1].1?a[2].1?...?xi=1a[n]

同理局部分析每一项

得到结果

xi=1a[1]?xi=1a[2]?...?xi=1a[n]

所以只要处理每一项的和就可以了。

后记:考试的时候脑残加了个map,明明用sort就能处理重复了好么!这题还要加离散化,根据数据范围来看。考试的时候取模没取模明白结果70分,所以索性都开long long 能取模的地方就取。

代码

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define mod 1000000007
#define N 100100
using namespace std ;
typedef long long ll ;
struct node
{
    ll x , y ;
};
node a[N] ;
ll n , m , k ;
ll num[N] ;
ll tot ;
int cmp(node a , node b)
{
    if(a.x == b.x) return a.y < b.y ;
    return a.x < b.x ;
}
ll quick_my(ll a , ll b)
{
    ll ret = 1 ;
    while(b)
    {
        if(b&1)ret=(ret*a)%mod;
        a=(a*a)%mod;
        b/=2;
    }
    return ret ;
}
int main()
{
    scanf("%lld%lld%lld" , &n , &m , &k) ;
    for(int i = 1 ; i <= k ; i++)
    {
        scanf("%lld%lld" , &a[i].x , &a[i].y) ;
    }
    sort(a+1 , a+k+1 , cmp) ;
    for(int i = 1 ; i <= k ; i++)
    {
        if(a[i].x==a[i-1].x&&a[i].y==a[i-1].y) continue ;
        if(a[i].x!=a[i-1].x)
        {
            tot ++ ;
            num[tot] = (num[tot]+a[i].y)%mod ;
            continue ;
        }
        if(a[i].x==a[i-1].x&&a[i].y!=a[i-1].y)
        {
            num[tot] = (num[tot]+a[i].y)%mod ;
            continue ;
        }
    }
    ll tmp = ((n*(n+1))/2)%mod ;
    ll ans = quick_my(tmp,m-tot);
    for(int i = 1 ; i <= tot ; i++)
    {
        ans = (ans*((((tmp-num[i])%mod)+mod)%mod))%mod ;
    }
    printf("%lld\n" , ans) ;
}

BZOJ 2751 [HAOI2012]容易题 数学

标签:容易题   bzoj   数学   数据   瞎搞   

原文地址:http://blog.csdn.net/wzq_qwq/article/details/45625523

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