hdu 4790 数学

/*
题意:给你二个区间[a,b]和[c,d]
分别从中选一个数x和y使的(x+y)%p=m;
可以这样来求,先求出(0->b和0->d区间段的值)-(区间0->a-1和0->d的值)-(区间0->b和0->c-1的值)+(0->a-1和0->c-1)的值
而且发现有这样的规律对于连个区间的末端值a和b来说
当在0->a这个区间内有一个单调性,a->b-1这个区间内有单调性,b-(a+b-m)/p*p这个区间内有单调性
直接用等差数列计算即可
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ll __int64
ll p,m;
ll f(ll aa,ll bb)
{
    if(aa<0||bb<0)return 0;
    ll i;
    if(aa>bb)
    {
        i=aa;
        aa=bb;
        bb=i;
    }
    i=0;
    ll j=0;
    ll sum=0;
    i=(aa-m)/p;
    if(i>=0&&aa>=m)
    {
        sum+=(m+1+i*p+m+1)*(i+1)/2;
        i++;
    }
    else i=0;
    // printf("i=%I64d\n",sum);
    j=(bb-m)/p;
    if((bb-m)%p==0)j--;
    if(j>=i&&bb>=m)
    {
        sum+=(aa+1)*(j-i+1);
        j++;
    }
    else
        j=i;
    //  printf("j=%I64d\n",sum);
    ll k=(aa+bb-m)/p;
    if(k>=j&&aa+bb>=m)
    {
        //   printf("%I64d %I64d\n",aa,bb);
        sum+=(aa+bb+1)*(k-j+1);
        //  printf("k=%I64d\n",sum);
        sum-=(j*p+m+k*p+m)*(k-j+1)/2;
    }
    // printf("%I64d\n",sum);
    return sum;
}
ll gcd(ll a,ll b)
{
    if(b==0)return a;
    return gcd(b,a%b);
}
int main()
{
    ll t,a,b,c,d,aa,bb,k=0;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&p,&m);
        aa=f(b,d)-f(a-1,d)-f(b,c-1)+f(a-1,c-1);
        if(aa==0)
        {
            printf("Case #%I64d: 0/1\n",++k);
            continue;
        }
        bb=gcd(aa,(b-a+1)*(d-c+1));
        printf("Case #%I64d: %I64d/%I64d\n",++k,aa/bb,(b-a+1)*(d-c+1)/bb);
    }
    return 0;
}

时间: 2024-08-27 01:33:52

hdu 4790 数学的相关文章

hdu 4961 数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=4961 先贴个O(nsqrtn)求1-n所有数的所有约数的代码: vector<int>divs[MAXN]; void caldivs() { for(int i=1;i<MAXN;i++) for(int j=i;j<MAXN;j+=i) divs[j].push_back(i); } 有了这个当时理下思路就可写了,但是重复数处理注意: 1.用一个数组vis[]  vis[i]=1表示i存在

hdu 4790 Just Random 神奇的容斥原理

1 /** 2 大意: 给定[a,b],[c,d] 在这两个区间内分别取一个x,y 使得 (x+y)%p = m 3 思路:res = f(b,d) -f(b,c-1)-f(a-1,d)+f(a-1,c-1); f(b,d ) 表示在[0,b],[0,d] 之间有多少个符合上述要求的数 4 1.将[0,b] 分为两部分, b/p 和 b%p 能整除p的[0,(b/p)*p] 和[(b/p)*p+1,b ] 同理[0,d]也可以这样分, 这样对于[0,b] [0,d ] 分别有两种情况,则一共有四

HDU - 4790 Just Random

题意:求从[a,b],[c,d]两个区间找到两个数使得他们的和%p=m,求概率 思路:我们想办法把区间的左范围化到0,那么结果就相对好弄了,应用容斥原理比直接解答问题简单点,假设f(a,b)是区间[0,a],[0,b]中满足条件的个数,设p=6.m=2 那么第一个区间可以看成 : A=[0,1,2,3,4,5]+[0,1,2,3,4,5]+..... B= (0,1,2,3,4) 第二个区间可以看成:C=[0,1,2,3,4,5]+....D=(0,1) 那么题目就可以看成:A+C,A+D, B

HDU 4790 Just Random 【构造】

题目链接:传送门 题目大意:给你a, b, c, d, p and m(0 <= a <= b <= 109, 0 <=c <= d <= 109, 0 <= m < p <= 109).让你从 [a, b] 中取出一个x,从[c, d] 中取出一个y,使得(x+y)(mod p)=m,求一共有多少种可能. 看见题目就想到了用构造的想法,讲解构造成二维坐标系,x+y=k*p+m是一条线,求这条线与构造的矩形(由点组成)一共有几个交点,这个矩阵也是有一定

HDU 4790 Just Random 数学

链接:pid=4790">http://acm.hdu.edu.cn/showproblem.php?pid=4790 意:从[a.b]中随机找出一个数字x,从[c.d]中随机找出一个数字y.给出p.m,假设(x+y)%p==m则算成功,问成功的概率是多少. 思路:[a.b]中连续p个数.[c,d]中连续p个数.用这2*p个数进行组合能找到p种的成功组合(详细不证),所以找到[a.b]中p循环的个数x1,[c,d]中p循环的个数y1,则它们组成的成功组合数为p*x1*y1. 然后是处理边界

hdu 4790 Just Random 容斥原理+数学

Just Random Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1723    Accepted Submission(s): 483 Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game w

hdu 4790 Just Random (2013成都J题) 数学思路题 容斥

题意:在[a,b]  [c,d] 之间,和模p等于m的对数 详见代码 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include<cmath> 5 #define LL long long 6 using namespace std; 7 int T; 8 LL a,b,c,d,p,m; 9 10 LL gcd(LL a, LL b) { 11 return b ?

hdu 4790 Just Random (思路+分类计算+数学)

Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with number together. In each game the following will be done: 1. Coach Pang randomly choose a integer x in [a, b] with equal probability. 2. Uncle Yang r

hdu - 4790 - Just Random(容斥 + 组合数学)

题意:在 [a, b] 取一个整数 x,在 [c, d] 取一个整数 y,求满足 (x + y) % p = m 的 (x, y) 的对数(0 <= a <= b <= 10 ^ 9, 0 <=c <= d <= 10 ^ 9, 0 <= m < p <= 10 ^ 9). 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4790 -->>2013年成都区赛最后一题,当时TLE6次无果....加