HDU4790

来源:互联网 发布:宋向金称臣 知乎 编辑:程序博客网 时间:2024/05/16 09:10

//这道题写了我两三天,队友都不愿意写了;

//整个人都不好了,其实这道题的算法还是比较简单的,就是当时脑子抽了,写的太累了,完全没有状态;

主要是利用区间的性质来解决问题的;

例如a--------------b;

             c-------------------d;

那么我们可以看成

            a+c--------------------a+d;

                   a+c+1-------------------a+d+1

.                                ........................................

                                  b+c-----------------b+d

这样从a+c到b+c+1这段是等差数列,到这里就很明显了;

#include <iostream>#include<stdio.h>#include<string.h>#include<iostream>using namespace std;long long a,b,c,d,p,m;long long gcd(long long a,long long b){   if(b==0)    return a;   else    return gcd(b,a%b);}long long sum(long long a,long long b){    long long chang=b-a+1;    long long ans=0;    long long k=a%p;    if(k>m)    chang-=p+m-k;    if(k<m)    chang-=m-k;    if(chang<=0)    return 0;    long long m1=chang/p;    //long long m2=m1;    if(chang%p)        m1++;    ans+=(chang+chang-(m1-1)*p)*(m1)/2;   //cout<<ans<<endl;   return ans;}long long sum2(long long a,long long b){    long long chang=b-a+1;//cout<<chang<<endl;    long long ans=0;    long long k1=b%p;    //cout<<k1<<endl;    if(k1>m)        chang-=k1-m;    if(k1<m)        chang-=p+k1-m;       // cout<<chang<<endl;    if(chang<=0)        return 0;    long long m1=chang/p;    //long long m2=m1;   // cout<<chang<<" "<<m1<<endl;    if(chang%p)        m1++;    ans+=(chang+chang-(m1-1)*p)*(m1)/2;    //cout<<3<<" "<<ans<<endl;    return ans;}long long sum1(long long a,long long b){    //cout<<a<<" "<<b<<endl;    long long chang=b-a+1;    long long k1=a%p;    if(k1>m)     chang-=p+m-k1;    if(k1<m)    chang-=m-k1;    if(chang<=0)        return 0;    long long m1=chang/p;    if(chang%p)    return m1+1;    else        return m1;}int main(){    long long case1,cnt=1;    cin>>case1;    while(case1--)    {         cin>>a>>b>>c>>d>>p>>m;         long long k1,k2,k3,k4,k5;         if(d-c>b-a)         {             k1=a+c;             k2=a+d;             k3=b+c;             k4=b+d;             k5=b-a+1;         }         else         {             k1=c+a;             k2=c+b;             k3=a+d;             k4=d+b;             k5=d-c+1;         }         //cout<<k1<<" "<<k2<<" "<<k3<<" "<<k4<<" "<<k5<<endl;         long long ans1=sum2(k1,k3-1);         long long ans2=sum(k2+1,k4);         long long ans3=sum1(k3,k2)*k5;         //cout<<ans3<<endl;         long long m1=gcd((b-a+1)*(d-c+1),ans1+ans2+ans3);         cout<<"Case #"<<cnt<<": ";         cnt++;         cout<<(ans1+ans2+ans3)/m1<<"/"<<(b-a+1)*(d-c+1)/m1<<endl;    }    return 0;}


0 0
原创粉丝点击