// 今晚翻看这道题,发现好多人一发过了,我想它应该不难吧,但自己始终没想明白,到底该如何构造一种符合题意封闭的加法和乘法运算。参考了这里的说明,才完全弄懂了。
题目要求重新定义加法和乘法,对任意非负整数都满足:(m+n)p=mp+np,其中p为素数。
之前我在数论部分的博客已经提到过飞马小定理,比赛时候面对这题时竟然完全没有联想到,反倒还被题目的各种概念给绕晕。再次重点说明费马小定理:
假如p是质数,且gcd(a,p)=1,那么 ap-1≡1(mod p)
因为给定的p是素数,根据费马小定理得 (m+n)p−1≡1 (mod p), 且mp+np≡m+n (mod p)
因此,(m+n)p≡m+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,代码更显简短清爽~~~