HDU-4790 Just Random

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=4790

题意:

给出两个区间,在这两个区间中各随机选取一个数,求这两个数的和mod p == m 的概率。

思路:

数学题,,YY题,,

两区间中的数连续,所以加和可以视为一个平行四边形,4个顶点的位置在a+c,a+d,b+c,b+d;

其中在a+b到b+c之间的数必然出现d-c次,两边的数出现次数为等差数列,求满足条件的点在不同区域的多少利用等差数列求和优化即可,,

代码:

long long n,m;
long long flag,sum,ave,ans,res;

long long GCD(long long x,long long y)
{   return y?GCD(y,x%y):x;  }

int main()
{
    long long i,j,k,kk,t,x,y,z,a,b,c,d,p,l,r;
    scanf("%lld",&k);
    kk=0;
    while(k--)
    {
        scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&p,&m);
        if(d-c>b-a){a^=c;c^=a;a^=c;b^=d;d^=b;b^=d;}
        l=a+c;r=b+d;x=a+d;y=c+b;
        res=0;

        i=l/p;
        if(i*p+m<l)i++;
        j=x/p;
        if(j*p+m>x)j--;
        if(i<=j)
            res+=((i*p+m+j*p+m-l-l+2)*(j-i+1)/2);

        i=y/p;
        if(i*p+m<y)i++;
        j=r/p;
        if(j*p+m>r)j--;
        if(i<=j)
            res+=((-i*p-m-j*p-m+r+r+2)*(j-i+1)/2);

        i=x/p;
        if(i*p+m<x)i++;
        j=y/p;
        if(j*p+m>y)j--;
        if(i<=j)
            res+=(d-c+1)*(j-i+1);

        if(x%p==m)res-=(d-c+1);
        if(y%p==m)res-=(d-c+1);
        sum=(d-c+1)*(b-a+1);
        
        t=GCD(sum,res);
        printf("Case #%lld: %lld/%lld\n",++kk,res/t,sum/t);
    }
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值