题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6440
题意:
对于
0
<
=
i
,
j
<
p
0 <= i , j < p
0<=i,j<p定义一种加法与乘法的运算,使得下式对于任意
0
<
=
a
,
b
<
p
0<=a,b<p
0<=a,b<p都成立,其中
p
p
p是为素数
(
a
+
b
)
n
=
a
n
+
b
n
(a + b) ^ n = a^n + b ^ n
(a+b)n=an+bn
题目要求输出每一个
i
+
j
i + j
i+j和
i
∗
j
i * j
i∗j的结果
题目分析:
对于这个题目,我们看到题目给我们的条件中给出,
p
p
p为素数,还有
p
p
p次方,我们尝试用,费马小定理去解决这道题目:
a
p
−
1
≡
1
(
m
o
d
p
)
a ^ p - 1\equiv 1{\pmod p}
ap−1≡1(modp)
因为
a
<
p
a < p
a<p,我们在等式两边同时乘上
a
a
a可以得到
a
p
≡
a
(
m
o
d
p
)
a ^ p\equiv a{\pmod p}
ap≡a(modp),
因为
(
a
+
b
)
(
m
o
d
p
)
=
a
(
m
o
d
p
)
+
b
(
m
o
d
p
)
,
(
a
∗
b
)
(
m
o
d
p
)
=
a
(
m
o
d
p
)
∗
b
(
m
o
d
p
)
(a + b){\pmod p} = {a\pmod p} + {b\pmod p},(a * b){\pmod p} ={a\pmod p} * {b\pmod p}
(a+b)(modp)=a(modp)+b(modp),(a∗b)(modp)=a(modp)∗b(modp),因此我们在每次加法与乘法运算的时候都对
p
p
p取模,利用这种运算我们得到等式左边等于
a
+
b
a + b
a+b,等式右边也等于
a
+
b
a + b
a+b,构造完成
#include <cstdio>
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
printf("%d%c",(i + j) % n,j == n - 1 ? '\n' : ' ');
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
printf("%d%c",(i * j) % n,j == n - 1 ? '\n' : ' ');
}
return 0;
}