【BZOJ2751】【HAOI2012】容易题(easy) 快速幂快速乘

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44684583");
}

题解:

询问只有10万个,所以有相同性质的连一块的点很多。

所以我们把109点分成最多2?105块。然后就随便乱搞了。

分成2?105块的过程是先把点排个序,然后就对每个点暴力往下删了。

然后分完了以后就是把所有的点的选择个数x乘起来就行了。长度为y那就乘xy

然后可能会爆,所以需要快速乘,请见mul部分。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 201000
#define mod 1000000007
using namespace std;
struct Eli
{
    long long x,y,z;
    void read(){cin>>x>>y;}
    Eli(long long _x=0,long long _y=0,long long _z=0):x(_x),y(_y),z(_z){}
    bool operator <(const Eli &A)const
    {return x==A.x?y<A.y:x<A.x;}
}eli[N],src[N];
long long n,m,p,cnt;
long long mul(long long a,long long b)
{
    long long ret=0;
    while(b)
    {
        if(b&1)ret=(ret+a)%mod;
        a<<=1,a%=mod,b>>=1;
    }
    return ret;
}
long long power(long long a,long long b)
{
    long long ret=1;
    while(b)
    {
        if(b&1)ret=mul(ret,a);
        a=mul(a,a),b>>=1;
    }
    return ret;
}
long long ans=0;
long long lsum[N],rsum[N];
int main()
{
    int i,j,k;

    cin>>n>>m>>p;
    for(i=1;i<=p;i++)eli[i].read();
    sort(eli+1,eli+p+1);

    long long sum=n*(n+1)/2;
    long long t=sum,last=1ll,r=n;
    for(i=1;i<=p;i++)
    {
        if(eli[i].x!=last)
        {
            src[++cnt]=Eli(1,r%mod,t%mod);
            k=eli[i].x-last;
            if(k>1)src[++cnt]=Eli(k-1,n%mod,sum%mod);
            last=eli[i].x,r=n-1,t=sum-eli[i].y;
        }
        else {
            if(eli[i].y==eli[i-1].y)continue;
            r--,t-=eli[i].y;
        }
    }
    src[++cnt]=Eli(1,r%mod,t%mod);
    k=m-last;
    if(k)src[++cnt]=Eli(k,n%mod,sum%mod);

/*  lsum[0]=rsum[cnt+1]=1ll;
    for(i=1;i<=cnt;i++)
    {
        lsum[i]=lsum[i-1]*power(src[i].y,src[i].x)%mod;
    }
    for(i=cnt;i;i--)
    {
        rsum[i]=rsum[i+1]*power(src[i].y,src[i].x)%mod;
    }
    for(i=1;i<=cnt;i++)
    {
        ans=(ans+src[i].x*src[i].z%mod*lsum[i-1]%mod*rsum[i+1]%mod)%mod;
    }*/
        ans=1;
    for(i=1;i<=cnt;i++)
    {
        ans=ans*power(src[i].z,src[i].x)%mod;
    }

    cout<<ans<<endl;
    return 0;
}
时间: 2024-08-08 22:33:56

【BZOJ2751】【HAOI2012】容易题(easy) 快速幂快速乘的相关文章

bzoj2751: [HAOI2012]容易题(easy)

结论很简单,就是把每个位置的数相加再相乘就好了.对于限制比较少,而位置比较多,所以处理出限制的位置,剩余位置用快速幂就好了. 1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls c[x][0] 6 #define rs c[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int

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]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可

hdu 5187 快速幂快速乘法

http://acm.hdu.edu.cn/showproblem.php?pid=5187 Problem Description As one of the most powerful brushes, zhx is required to give his juniors n problems. zhx thinks the ith problem's difficulty is i. He wants to arrange these problems in a beautiful wa

取模性质,快速幂,快速乘,gcd和最小公倍数

一.取模运算 取模(取余)运算法则: 1. (a+b)%p=(a%p+b%p)%p; 2.(a-b)%p=(a%p-b%p)%p; 3.(a*b)%p=(a%p * b%p)%p; 4.(a^b)%p=(   (a%p)^b  )%p; 5. (  (a+b)%p+c  )%p=( a+(b+c)%p  )%p; 6.( a*(b*c)%p )%p =( c*(a*b)%p )%p; 7.( (a+b)%p*c )%p= ( (a*c)%p + (b*c)%p )%p; 几条重要性质: 1.a≡

HDU - 5187 zhx&#39;s contest(快速幂+快速乘法)

作为史上最强的刷子之一,zhx的老师让他给学弟(mei)们出n道题.zhx认为第i道题的难度就是i.他想要让这些题目排列起来很漂亮. zhx认为一个漂亮的序列{ai}下列两个条件均需满足. 1:a1..ai是单调递减或者单调递增的. 2:ai..an是单调递减或者单调递增的. 他想你告诉他有多少种排列是漂亮的.因为答案很大,所以只需要输出答案模p之后的值. Input Multiply test cases(less than 10001000). Seek EOF as the end of

【bzoj2751】[HAOI2012]容易题(easy) 数论,简单题

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

BZOJ2751 [HAOI2012]容易题

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

【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)

读了一下题就会很愉快的发现,这个数列是关于p的幂次的斐波那契数列,很愉快,然后就很愉快的发现可以矩阵快速幂一波,然后再一看数据范围就......然后由于上帝与集合对我的正确启示,我就发现这个东西可以用欧拉函数降一下幂,因为两个数一定互质因此不用再加一个phi(m),于是放心的乘吧宝贝!! #include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include &

ACM:a^b%p-数论-快速幂-快速乘

a^b Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: Description 求a的b次方,取模mod(1<=a,b,mod<=1e18) Input 多组输入,每组数据一行,3个正整数,分别为a,b,mod Output 每组数据输出一行,为答案 Sample Input 2 10 10000000 5 100 1 0 2 37 Sample Output 1024 0 0 //模版题,主要是考虑到1e18的巨大,