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 }
解题思路二:
由费马小定理可知 $(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 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”