HDU6440 Dream

题目链接:https://vjudge.net/problem/HDU-6440

知识点:  构造、费马小定理

题目大意:

  给定一个素数 $p$,要求定义一个加法运算表和一个乘法运算表,尺寸都为 $p \times p$,加法运算表上第 $i$ 行第 $j$ 列的元素代表 $(i-1)+(j-1)$ 的值,乘法运算表上第 $i$ 行第 $j$ 列的元素代表 $(i-1) \times (j-1)$ 的值。要求满足两个条件:

  一、对于任意 $0 \le n,m < p$,$(n+m)^p = n^p + m^p$;

  二、存在一个 $q(0<q<p)$,使得 ${q^{k}|0<k<p, k \in Z} = {k|0<k<p, k \in Z}$.

解题思路一:

  加法运算表全部置为 $2$;

  乘法运算表上,首先第一行和第一列都置为 $0$,对于其他部分,第二行全置 $2$,第三行全置 $3$,依次类推直到倒数第二行,最后一行全置 $1$.

代码一:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main(){
 5     int t;
 6     scanf("%d",&t);
 7     while(t--){
 8         int p;
 9         scanf("%d",&p);
10         for(int i=0;i<p;i++){
11             printf("2");
12             for(int j=1;j<p;j++)
13                 printf(" 2");
14             puts("");
15         }
16 
17         printf("0");
18         for(int i=1;i<p;i++)    printf(" 0");
19         puts("");
20 
21         for(int i=2;i<p;i++){
22             printf("0");
23             for(int j=1;j<p;j++)
24                 printf(" %d",i);
25             puts("");
26         }
27 
28         printf("0");
29         for(int i=1;i<p;i++)    printf(" 1");
30         puts("");
31     }
32     
33     return 0;
34 }
View Code

 

 

解题思路二:

  由费马小定理可知 $(n+m)^p \equiv (n+m) \equiv n^{p} + m ^{p} (mod p)$,故只需将加法运算表和乘法运算表都定义为在模 $p$ 意义下的运算表即可。

代码二:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main(){
 5     int t;
 6     scanf("%d",&t);
 7     while(t--){
 8         int p;
 9         scanf("%d",&p);
10         for(int i=0;i<p;i++){
11             printf("%d",i);
12             for(int j=1;j<p;j++)
13                 printf(" %d",(i+j)%p);
14             puts("");
15         }
16 
17         for(int i=0;i<p;i++){
18             printf("0");
19             for(int j=1;j<p;j++)
20                 printf(" %d",i*j%p);
21             puts("");
22         }
23     }
24 
25     return 0;
26 }
View Code

 

posted @ 2018-08-27 20:24  Blogggggg  阅读(274)  评论(0编辑  收藏  举报