成都赛区的j题,表示没有想到太好的做法,就用了个比较麻烦的,先把问题转换成%p==0的
a+=p-m;
b+=p-m;
m=0;
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
long long a,b,c,d,p,m;
long long x,y;
long long cal(ll a,ll b,ll p)
{
ll ret=0;
ll tmp=(a/p+1)*p;
if(tmp>=b) return a/p*(b-a+1);
ret+=(a/p)*(tmp-a);
ll txt=(b/p)*p;
if(txt>=tmp)
ret+=(a/p+b/p)*(txt-tmp)/2;
ret+=b/p*(b-txt+1);
return ret;
}
ll work(ll a,ll b,ll p)
{
return (b/p-a/p)+(a%p==m);
}
ll gcd(ll a,ll b)
{
ll tmp;
while(a%b)
{
tmp=a%b;
a=b;
b=tmp;
}
return b;
}
void solve()
{
ll tmp=gcd(x,y);
x/=tmp;
y/=tmp;
}
int main()
{
// freopen("in.txt","r",stdin);
int T,tt=0;;
scanf("%d",&T);
while(T--)
{
scanf("%I64d %I64d %I64d %I64d",&a,&b,&c,&d);
scanf("%I64d %I64d",&p,&m);
a+=p-m;
b+=p-m;
m=0;
y=(b-a+1)*(d-c+1);
x=0;
long long up=cal(a+d,b+d,p);
long long down=cal(a+c,b+c,p);
long long ret=up-down;
ret+=work(a+c,b+c,p);
x=ret;
solve();
printf("Case #%d: %I64d/%I64d\n",++tt,x,y);
}
return 0;
}