2013 Multi-University Training Contest 2

来源:互联网 发布:win7打开本地端口 编辑:程序博客网 时间:2024/05/29 19:54

从比赛开始到结束一直在搞1001,,为什么版刷题我们过不了。。。一直debug,,终于AC了。。。我写的都无力了。。。


#include<iostream>#include<cmath>#include<cstring>#include<string>#include<algorithm>#include<iomanip>#include<cstdio>using namespace std;__int64 gcd(__int64 a,__int64 b){    if(b==0)    {        return a;    }    else    {        return gcd(b,a%b);    }}__int64 g(int n,int a,int b){    __int64 ans=0;    int i=0,x1=0,y1=0,tp=0;    while(i<n)    {        if((x1+a)>=n&&(y1+b)>=n)        {            ans+=(__int64)(n-i)*tp;            i=n;            continue;        }        if((x1+a)<(y1+b))        {            ans+=(__int64)tp*(x1+a-i);            i=x1+a;            tp=i-y1;            x1+=a;        }        else if((x1+a)==(y1+b))        {            ans+=(__int64)tp*(x1+a-i);            i=x1+a;            x1+=a;            y1+=b;            tp=0;        }        else        {            ans+=(__int64)tp*(y1+b-i);            i=y1+b;            y1+=b;            tp=i-x1;        }    }    return ans;}int main(){    int t,n,x,y,a,b;    __int64 sum,tmp,ans;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d",&n,&x,&y);        if(x==y)        {            printf("0\n");            continue;        }        a=max(x,y);        b=min(x,y);        sum=(__int64)a/gcd(a,b)*(__int64)b;        if(sum>= n)        {            printf("%I64d\n",g(n,a,b));            continue;        }        tmp=g(sum,a,b);        ans=tmp*(n/sum)+g(n%sum,a,b);        printf("%I64d\n",ans);    }    return 0;}


原创粉丝点击