心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
题目大意:给出x和k,求p*floor(x/k)+q*ceil(x/k)==x的一组解(p,q)。
不要相信题目最后所说的64位整数,这道题目用long long或int64的结果就是超时!改回long之后,AC!不多说了,就是考察扩展欧几里德算法。
以下是我的代码:
#include<stdio.h>
#include
<math.h>

//#define LOCAL

#ifdef LOCAL
#include
<time.h>
#endif
void gcd(long a,long b,long &d,long &x,long &y)
{
    
if(b==0){d=a;x=1;y=0;}
    
else{gcd(b,a%b,d,y,x);y-=x*(a/b);}
}
int main()
{
    #ifdef LOCAL
    freopen(
"data.in","r",stdin);
    freopen(
"data.out","w",stdout);
    
#endif
    
long test;
    scanf(
"%ld",&test);
    
while(test--)
    {
       
long a,b,c,k,x,y,d;
       scanf(
"%ld%ld",&c,&k);
       a
=(long)floor((double)c/k);
       b
=(long)ceil((double)c/k);
       gcd(a,b,d,x,y);
       x
*=(c/d);
       y
*=(c/d);
       printf(
"%ld %ld\n",x,y);
    }
    #ifdef LOCAL
    printf(
"time = %.4lf\n",(double)clock()/CLOCKS_PER_SEC);
    
#endif
return 0;
}


posted on 2010-02-07 14:32 lee1r 阅读(419) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数学/数论

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理