题目描述
在冬马曜子工作室的安排下,和纱会在维也纳休养a天,然后去日本开b-a天音乐会,并以b天为一周期不断循环。而根据Knight Records的工作安排,雪菜会去外地出差c天,然后休息d-c天,并以d天为以一周期不断循环。如果雪菜处在休息时间,那么她一定会去和纱在当天的音乐会(即使她前一天也去过了)。春希想知道在前n天中,雪菜一共去了几天音乐会。
a,b,c,d,n(1≤a<b≤109,b−a≤103,1≤c<d≤109,d−c≤103,1≤n≤bd)。
思路:扩展欧几里得解不定方程,注意求gcd用int 优化时间。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define ll long long
using namespace std;
int T;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return;}
exgcd(b,a%b,x,y);
ll t=x;
x=y;y=t-a/b*y;
}
int main()
{
scanf("%d",&T);
while(T--)
{
ll m,n,l,sum=0,ans=0;
int a,b,c,d,aa,bb,cc,t,x,y;
scanf("%d%d%d%d%lld",&a,&b,&c,&d,&n);
for(int A=a+1;A<=b;A++)
{
for(int B=c+1;B<=d;B++)
{
aa=-b;bb=d;cc=A-B;
t=gcd(aa,bb);
if(cc%t!=0) continue;
aa/=t;bb/=t;cc/=t;
exgcd(aa,bb,x,y);
if(bb<0) bb=-bb;
x=((1ll*cc*x)%bb+bb)%bb;
if(n-A<0) sum=0;
else if((n-A)/b-x<0) sum=0;
else sum=((n-A)/b-x)/bb+1;
ans+=sum;
}
}
printf("%lld\n",ans);
}
}