水题两篇 Dream & Find Integer (HDU 6440/6441)

 // 出自ICPC 2018网络赛C - Dream & D - Find Integer

 // 对大佬来讲的水题,本菜鸡尽量学会的防爆零题。。。

 // 今晚翻看vjudge昨日任务上的C题,发现好多人一发过了,我想它应该不难吧,但自己始终没想明白,到底该如何构造一种符合题意封闭的加法和乘法运算。

 // 参考了这里的说明,才完全弄懂了,写点东西记录学习成果。

C - Dream (HDU 6440)

      题目要求重新定义加法和乘法,对任意非负整数都满足:(m+n)p=mp+np,其中p为素数。 之前我在数论部分的博客已经提到过费马小定理,比赛时候面对这题时竟然完全没有联想到,反倒还被题目的各种概念给绕晕。这里再次说明费马小定理

假如p是质数,且gcd(a,p)=1,那么 ap-1≡1(mod p)

      这样就找到了符合题意的运算,即模p加法与模p乘法。明白这一点,代码就很简单了:

 

#include <cstdio>.
#include <iostream>
#define sci(i) scanf("%d", &i)
#define rep(i, a, b) for(int i=a;i<b;i++)
using namespace std;

int main()
{
    int T;  sci(T);
    while(T--)
    {
        int p;  sci(p);
        rep(i, 0, p)
        {
            rep(j, 0, p)
                printf("%d ", (i+j)%p);
            printf("\n");
        }

        rep(i, 0, p)
        {
            rep(j, 0, p)
                printf("%d ", i*j%p);
            printf("\n");
        }
    }
    return 0;
}
View Code

  // 第一次尝试用以上宏定义#define的新姿势,代码更显简短清爽~~~

 

 

D - Find Interger (HDU 6441)

      题意很明朗: 给定a和n,求满足条件 an+bn=cn 的正整数b和c。

 // 上一行会吞字,原因不明。。。

 // 避免吞字,截图插入。。。

 // 左边原文,右边显示

 

      这费马大定理有关:

当整数时,关于的方程没有正整数解

      那么题目就简单分四种情况:

  1. n>2,由费马大定理可知,不存在解
  2. n=0时,等式恒不成立,无解输出 -1 -1
  3. n=1时,可取b=1, c=a+1
  4. 对于n=2的解(b, c),详细见代码部分的注释
#include <iostream>
#include <cstdio>
using namespace std;

int n, a;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        scanf("%d %d", &n, &a);
        if(n>2||n==0) {printf("-1 -1\n"); continue; }
        if(n==1) {printf("1 %d\n", a+1); continue; }
        else
        { //a*a = c*c - b*b = (c-b)*(c+b)
            if(a&1) // c-b=1, c+b=a*a
                printf("%d %d\n", (a*a-1)/2, (a*a+1)/2);
            else // c-b=2, c+b=a*a/2
                printf("%d %d\n", (a*a/2-2)/2, (a*a/2+2)/2);
        }
    }
    return 0;
}

     

End.

posted @ 2018-08-27 21:55  izcat  阅读(348)  评论(4编辑  收藏  举报