题目:
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;
}