• 2018 Wannafly summer camp Day2--Utawarerumono


    Utawarerumono

    描述

    题目描述:

    算术是为数不多的会让久远感到棘手的事情。通常她会找哈克帮忙,但是哈克已经被她派去买东西了。于是她向你寻求帮助。

    给出一个关于变量x,y的不定方程ax+by=cax+by=c,显然这个方程可能有多个整数解。久远想知道如果有解,使得p2x^2+p1x+q2y^2+q1y最小的一组整数解是什么。为了方便,你只需要输出p2x^2+p1x+q2y^2+q1y的最小值。

    输入:

    第一行三个空格隔开的整数a,b,c(0a,b,c105)

    第二行两个空格隔开的整数p1,p2(1p1,p2105)

    第三行两个空格隔开的整数q1,q2(1q1,q2105)

    输出:

    如果方程无整数解,输出``Kuon’’。

    如果有整数解,输出p2x^2+p1x+q2y^2+q1y的最小值。

    样例输入
    2 2 1
    1 1
    1 1
    样例输出
    Kuon
    由于一次项的影响较小,只考虑二次项p2*x^2+q1*y^2=p2*((c-by)/a)^2+q2*y^2,存在一个O(a)的|y|的取值满足c-by是一个a的倍数,
    此时|
    (c-by)/a|是O(c+b)的,这样就得到了一组不超过10^18的解,且答案不会更大。
    后发现多项式的值在X的绝对值增加的时候,只有在x<0的时候才会变小,当x<(-p1)/2p2的值仍然会增大,
    所以可以暴力枚举x或y的值(1e5就可以过了)。
     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cmath>
     4 #include<algorithm>
     5 #include<iostream>
     6 using namespace std;
     7 typedef long long ll;
     8 ll p2,p1,q2,q1;
     9 ll a, b, c, d, x, y;
    10 ll ans=1e18;
    11 ll Exgcd(ll a, ll b)
    12 {
    13     if(b==0){ x=1, y=0;return a;}
    14     ll r = Exgcd(b, a%b);
    15     ll tp=x;
    16     x = y;
    17     y = tp-a/b*y;
    18     return r;
    19 }
    20 int main()
    21 {
    22         cin>>a>>b>>c>>p1>>p2>>q1>>q2;
    23         d = Exgcd(a, b);
    24         if(a==0&&b==0&&c==0) printf("0
    ");
    25         if(((a==0)&&(b==0)&&c) || c%d!=0 )
    26             printf("Kuon
    ");
    27         else if(a&&b==0){
    28             if(c%a!=0){
    29                 printf("Kuon
    ");
    30             }else{
    31                 ll ta=c/a;
    32                 ll ee=p2*ta*ta+p1*ta;
    33                 cout<<ee<<endl;
    34             }
    35         }
    36         else if(a==0&&b)
    37         {
    38             if(c%b!=0)
    39                  printf("Kuon
    ");
    40             else{
    41                 ll tc=c/b;
    42                 ll eee=q2*tc*tc+q1*tc;
    43                 cout<<eee<<endl;
    44             }
    45         }
    46         else{
    47            for(int i=-100005;i<=100005;i++){
    48                 if((c-a*i)%b==0){
    49                     ll iy=(c-a*i)/b;
    50                     ll ac=p2*i*i+p1*i+q2*iy*iy+q1*iy;
    51                     ans=min(ans,ac);
    52                 }
    53            }
    54            cout<<ans<<endl;
    55         }
    56     return 0;
    57 }
    View Code
  • 相关阅读:
    多线程中thread和runnable
    安装hive 个人遇到的问题小问题
    Linux 简单命令学习记录
    shell脚本简单学习教训经验
    @AutoWired使用
    <jsp:directive.page>标签
    Hibernate session.saveOrUpdate()方法
    无法连接远程mysql问题
    svn版本控制
    Hql中占位符(转)
  • 原文地址:https://www.cnblogs.com/FlyerBird/p/9460227.html
Copyright © 2020-2023  润新知