hdu4790 Just Random

传送门

题意:给出两个区间[a,b],[c,d],各取一个数i,j,求能使(i+j)%p=m的概率

思路:总体可以取的数个数为(b-a+1)*(d-c+1),计算能满足条件的个数,如果列出来会发现会形成一个平行四边形,只要保证a+d>b+c时就可以把这个平行四边形分成三部分,然后分开找满足(i+j)%p=m的位置就可以了

完整代码:

#include <cstdio>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
typedef long long LL;
LL a,b,c,d,p,m;
long long gcd(long long a,long long b)
{
    if(b==0) return a;
    else gcd(b,a%b);
}
int main()
{
    LL t;
    scanf("%lld",&t);
    LL cnt=0;
    while(t--)
    {
        cnt++;
        LL ans=0;
        LL a,b,c,d,p,m;
        scanf("%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&p,&m);
        if((a+d)<(b+c))
            {swap(a,c);swap(d,b);}
        LL n=b-a+1;
        
        LL next1,pre1;
        if(m>=(a+c)%p) next1=m-(a+c)%p;
        else next1=m-(a+c)%p+p;
        if((b+c-1)%p>=m) pre1=(b+c-1)%p-m;
        else pre1=(b+c-1)%p-m+p;
        if(pre1<=b-a-1&&next1<=b-a-1)
            ans+=((1+next1)+(b-a-pre1))*(b-a-pre1-next1-1+p)/p/2;
        
        LL next2,pre2;
        if(m>=(a+d+1)%p) next2=m-(a+d+1)%p;
        else next2=m-(a+d+1)%p+p;
        if((b+d)%p>=m) pre2=(b+d)%p-m;
        else pre2=(b+d)%p-m+p;
        if(pre2<=b-a-1&&next2<=b-a-1)
            ans+=((1+pre2)+(b-a-next2))*(b-a-pre2-next2-1+p)/p/2;
        
        LL next3,pre3;
        if(m>=(b+c)%p) next3=m-(b+c)%p;
        else next3=m-(b+c)%p+p;
        if((a+d)%p>=m) pre3=(a+d)%p-m;
        else pre3=(a+d)%p-m+p;
        LL num=a+d-b-c+1;
        if(pre3<num&&next3<num)
        
            ans+=n*(b-a+num-pre3-(b-a+1+next3)+p)/p;
        LL sum=(b-a+1)*(d-c+1);
        LL g=gcd(ans,sum);
        ans/=g;
        sum/=g;
        cout<<"Case #"<<cnt<<": "<<ans<<"/"<<sum<<endl;
    }
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值