BZOJ 2751 HAOI 2012 容易题(easy) 数学

题目大意:给出一个序列中哪个位置不能出现哪一种数字,求可以组成的数列的积的和。

思路:如果我们让第一个位置确定,那么这个问题就可以转化成一个子问题。也就是第一位的数字乘上后面的积的和。推下去的话不难发现,其实求得就是每一位和的积。观察一下mn都很大,之后k不大,于是就用个map啥的随便记录一下,然后写个快速幂,再写个快速乘,没了。。

CODE:

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 100010
#define MO 1000000007
using namespace std;

map<int,long long> G;

int range,cnt,k;
long long base;

struct Complex{
    int pos,ban;

    bool operator <(const Complex &a)const {
        if(pos == a.pos)    return ban < a.ban;
        return pos < a.pos;
    }
    void Read() {
        scanf("%d%d",&pos,&ban);
    }
}src[MAX];

inline long long Plus(long long x,long long y)
{
    long long re = 0;
    while(y) {
        if(y&1) re = (re + x) % MO;
        x = (x << 1) % MO;
        y >>= 1;
    }
    return re;
}

inline long long Quick(long long x,long long y)
{
    long long re = 1;
    while(y) {
        if(y&1) re = Plus(re,x) % MO;
        x = Plus(x,x) % MO;
        y >>= 1;
    }
    return re;
}

int main()
{
    cin >> range >> cnt >> k;
    for(int i = 1; i <= k; ++i)
        src[i].Read();
    sort(src + 1,src + k + 1);
    for(int i = 1; i <= k; ++i)
        if(src[i].ban != src[i - 1].ban || src[i].pos != src[i - 1].pos)
            G[src[i].pos] += src[i].ban;
    if(range&1) base = Plus((range + 1) / 2,range) % MO;
    else    base = Plus(range / 2,range + 1) % MO;
    long long ans = 1;
    int total = 0;
    for(map<int,long long>::iterator it = G.begin(); it != G.end(); ++it,++total) {
        long long temp = base - it->second;
        while(temp < 0)  temp += MO;
        temp %= MO;
        ans = Plus(ans,temp) % MO;
    }
    ans = Plus(ans,Quick(base,cnt - total)) % MO;
    printf("%lld\n",ans);
    return 0;
}
时间: 2024-12-08 19:06:03

BZOJ 2751 HAOI 2012 容易题(easy) 数学的相关文章

BZOJ 2750 HAOI 2012 Road 高速公路 最短路

题意: 给出一个有向图,求每条边有多少次作为最短路上的边(任意的起始点). 范围:n <= 1500, m <= 5005 分析: 一个比较容易想到的思路:以每个点作为起点,做一次SPFA,记f[i]表示从点S到达点i的最短路数,g[i]表示从点i到达点T的最短路数. 那么对于任意一条边,答案就是∑f[u]*g[v] 剩下的问题就是f.g怎么求. f必须从前面的递推过来,如果前面的没有递推完,那么就不能递推当前点,需要记录每个点可以从多少个点递推过来,这个一次dfs就可以完成. g可以记忆化搜

BZOJ 2751: [HAOI2012]容易题(easy)

题目 2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 906  Solved: 390[Submit][Status] Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的

2751: [HAOI2012]容易题(easy)

2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1087  Solved: 477[Submit][Status][Discuss] Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可

[2012] 数组题

1.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数.打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 + 大众评委 *  0.4,总分取整.如果没有大众评委,则 总分 = 专家评委平均分,总分取整.函数最

[2012] 数组题(2)

给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数.      例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9,

[BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), (-b,a), (-b,-a)这些向量,问你能不能拼出另一个向量(x,y). 说明:这里的拼就是使得你选出的向量之和为(x,y) Input 第一行数组组数t,(t<=50000) 接下来t行每行四个整数a,b,x,y (-2109<=a,b,x,y<=2109) Output t行每行为Y

bzoj 2751 [HAOI2012]容易题(easy)(数学)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2751 [题意] m个位置,已知每个位置的可能取值,问所有可能情况的每个位置的乘积的和. [思路] 答案即为 前K中情况减去不可能的取值算sigma,后面的取值为(((n+1)n)/2)^(m-K) [代码] 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<al

BZOJ 2751 [HAOI2012]容易题 数学

题意:链接 方法:数学+瞎搞(注意取模问题) 解析:这题其实也没啥好说的,随便写写就出来了,我就直接挂几个过程.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] 所以只要处理每一项的和就可以了. 后记:考试的时候脑残加了个

BZOJ 2751 容易题

Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵! Input 第一行三个整数n,m,k分别表示数列元素的取值范围,数列元素个数,以及已知的限制条数.接下来k行,每行两个正整数x,y表示A[x]的值不能是y.