zoukankan      html  css  js  c++  java
  • poj 2142 && 2042

    题目:http://poj.org/problem?id=2142

    给出 a b d,找出 x 和 y 能够组合出 d,也就是满足 a * x + b * y = d,a 和 b 不一定是在天枰的同一边,利用扩展欧几里得求出 x , y, x,y可能为负值,把 x y 转化为最小的正整数,然后利用 最小的 x ,根据 ty = (d - a * x) / b,和最小的 y 根据 tx = (d - b * y) / a,判断 x + ty 和 y + tx的大小,然后输出结果

    View Code
     1 typedef long long ll;
     2 int exgcd(int a,int b,int &x,int &y)
     3 {
     4     if(!b)
     5     {
     6         x = 1,y = 0;
     7         return a;
     8     }
     9     int d = exgcd(b,a % b,x,y);
    10     int temp = x;
    11     x = y;
    12     y = temp - a / b * y;
    13     return d;
    14 }
    15 int main()
    16 {
    17     int a,b,d;
    18     int tem;
    19     int x,y;
    20     while(~scanf("%d%d%d",&a,&b,&d))
    21     {
    22         if(!a && !b && !d) break;
    23         tem = exgcd(a,b,x,y);
    24         x = (x * d) / tem;  //把 x y 转化为最小的正整数
    25         y = (y * d) / tem;  
    26         a /= tem; b /= tem; d /= tem;
    27         x = (x % b + b) % b;
    28         y = (y % a + a) % a;
    29         int ty = (d - a * x) / b;
    30         if(ty < 0) ty = -ty;
    31         int tx = (d - y * b) / a;
    32         if(tx < 0) tx = -tx;
    33         if(x + ty > tx + y)
    34         {
    35             x = tx;
    36             ty = y;
    37         }
    38         cout<<x<<" "<<ty<<endl;
    39     }
    40     return 0;
    41 }

    题目:http://poj.org/problem?id=2042

    给出一个x 找出 sum(pi ^ 2) = x,i 最多为 4 个,因为 n 的范围是 2 ^ 15,所以直接打表算出每一个 x 符合条件的个数,然后对应输出即可

    View Code
     1 typedef long long ll;
     2 const int N = 32768;
     3 int vis[32769];
     4 int main()
     5 {
     6     int i,j,k,h;
     7     int c[182];
     8     int n = 181;
     9     for(i = 1; i <= n; i++)
    10     {
    11         c[i] = i * i;
    12     }
    13     for(i = 1; i <= n; i++)
    14     {
    15         vis[c[i]] ++;
    16     }
    17     for(i = 1; i <= n; i++)
    18     {
    19         for(j = i; j <= n && c[i] + c[j] <= N; j++)
    20         vis[c[i] + c[j]] ++;
    21     }
    22     for(i = 1; i <= n; i++)
    23     {
    24         for(j = i; j <= n && c[i] + c[j] <= N; j++)
    25         {
    26             for(k = j; k <= n && c[i] + c[j] + c[k] <= N; k++)
    27             vis[c[i] + c[j] + c[k]] ++;
    28         }
    29     }
    30     for(i = 1; i <= n; i++)
    31     {
    32         for(j = i; j <= n && c[i] + c[j] <= N; j++)
    33         {
    34             for(k = j; k <= n && c[i] + c[j] + c[k] <= N; k++)
    35             {
    36                 for(h = k; h <= n && c[i] + c[j] + c[k] + c[h] <= N; h++)
    37                 vis[c[i] + c[j] + c[k] + c[h]] ++;
    38             }
    39         }
    40     }
    41     int m;
    42     while(~scanf("%d",&m),m)
    43     {
    44         printf("%d\n",vis[m]);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    在Ubuntu下使用命令删除目录
    Visual Studio添加lib到链接依赖项的几种方法
    svn回到某个历史版本的做法
    iOS菜鸟成长笔记(3)——斯坦福公开课学习(1)
    VS自定义开发向导中的vsdir文件的简单说明
    OpenGL编程逐步深入(十一)组合变换
    iOS菜鸟成长笔记(2)——网易彩票练习
    AngularJs轻松入门(九)与服务器交互
    AngularJs轻松入门(八)Cookies读写
    AngularJs轻松入门(七)多视图切换
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2771093.html
Copyright © 2011-2022 走看看