CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 去音乐会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fufck/article/details/87449826

题目链接

题目描述

在冬马曜子工作室的安排下,和纱会在维也纳休养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);
	}
}

猜你喜欢

转载自blog.csdn.net/fufck/article/details/87449826
今日推荐