zoukankan      html  css  js  c++  java
  • SGU 106 The equation 扩展欧几里得好题

    扩展欧几里得的应用……见算法竞赛入门经典p.179

    注意两点:1.解不等式的时候除负数变号

    2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 && b=0 && c!=0 ) ( a=0 && b!=0 )( a!=0 && b=0 )

     能加深对扩展欧几里得的理解,不错的一题

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <algorithm>
     6 
     7 #define LL long long int
     8 
     9 using namespace std;
    10 
    11 void ExGcd( LL a, LL b, LL &d, LL &x, LL &y )
    12 {
    13     if ( !b )
    14         d = a, x = 1, y = 0;
    15     else
    16     {
    17         ExGcd( b, a % b, d, y, x );
    18         y -= x * ( a / b );
    19     }
    20     return;
    21 }
    22 
    23 int main()
    24 {
    25     LL a, b, c, x1, x2, y1, y2;
    26     while ( scanf( "%I64d%I64d%I64d%I64d%I64d%I64d%I64d", &a, &b, &c, &x1, &x2, &y1, &y2 ) == 7 )
    27     {
    28         if ( a == 0 && b == 0 )
    29         {
    30             if ( c == 0 )
    31                 printf( "%I64d
    ", (x2 - x1 + 1)*(y2 - y1 + 1) );
    32             else puts("0");
    33             continue;
    34         }
    35         if ( a == 0 )
    36         {
    37             if ( (-c) % b == 0 )
    38             {
    39                 LL y = (-c) / b;
    40                 if ( y >= y1 && y <= y2 ) puts("1");
    41                 else puts("0");
    42             }
    43             else puts("0");
    44 
    45             continue;
    46         }
    47         if ( b == 0 )
    48         {
    49             if ( (-c) % a == 0 )
    50             {
    51                 LL x = (-c) / a;
    52                 if ( x >= x1 && x <= x2 ) puts("1");
    53                 else puts("0");
    54             }
    55             else puts("0");
    56             continue;
    57         }
    58         LL g, x0, y0;
    59         ExGcd( a, b, g, x0, y0 );
    60         if ( (-c) % g == 0 ) //如果有解
    61         {
    62             x0 = x0 * (-c) / g;
    63             y0 = y0 * (-c) / g;
    64 
    65             LL aa = a / g;
    66             LL bb = b / g;
    67             LL low, high;
    68             if ( aa > 0 && bb > 0 )
    69             {
    70                 low  = max( (x0 - x1) / bb, (y0 - y2) / aa );
    71                 high = min( (x2 - x0) / bb, (y0 - y1) / aa );
    72                 printf("%I64d
    ", high - low + 1 );
    73             }
    74             else if ( aa > 0 && bb < 0 )
    75             {
    76                 low  = max( (x2 - x0) / bb, (y0 - y2) / aa );
    77                 high = min( (x0 - x1) / bb, (y0 - y1) / aa );
    78                 printf("%I64d
    ", high - low + 1 );
    79             }
    80             else if ( aa < 0 && bb > 0 )
    81             {
    82                 low  = max( (x0 - x1) / bb, (y0 - y1) / aa );
    83                 high = min( (x2 - x0) / bb, (y0 - y2) / aa );
    84                 printf("%I64d
    ", high - low + 1 );
    85             }
    86             else if ( aa < 0 && bb < 0 )
    87             {
    88                 low  = max( (x2 - x0) / bb, (y0 - y1) / aa );
    89                 high = min( (x0 - x1) / bb, (y0 - y2) / aa );
    90                 printf("%I64d
    ", high - low + 1 );
    91             }
    92         }
    93         else puts("0");
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    大约PCA算法学习总结
    内部硬盘的硬件结构和工作原理进行了详细解释
    DWZ使用注意事项
    cocos2d-x 在XML分析和数据存储
    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth完全详细的说明
    hdu 1114 Piggy-Bank
    getResources()方法
    人机博弈-吃跳棋游戏(三)代移动
    Oracle 11g client安装和配置。
    的微信公众号开发 图灵机器人接口允许调用自己的微通道成为一个智能机器人
  • 原文地址:https://www.cnblogs.com/GBRgbr/p/3219257.html
Copyright © 2011-2022 走看看