HDU 6440 Dream 水题

 // 今晚翻看这道题,发现好多人一发过了,我想它应该不难吧,但自己始终没想明白,到底该如何构造一种符合题意封闭的加法和乘法运算。参考了这里的说明,才完全弄懂了。

    题目要求重新定义加法和乘法,对任意非负整数都满足:(m+n)p=mp+np,其中p为素数。

    之前我在数论部分的博客已经提到过飞马小定理,比赛时候面对这题时竟然完全没有联想到,反倒还被题目的各种概念给绕晕。再次重点说明费马小定理:

 

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

    因为给定的p是素数,根据费马小定理得 (m+n)p1(mod p), 且mp+npm+n (mod p)

 因此,(m+n)pm+n (mod p) ≡ mp+np (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, p;
    sci(T);
    while(T--)
    {
        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;
}

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

猜你喜欢

转载自www.cnblogs.com/izcat/p/9545079.html