1. 程式人生 > >HDU 6400(費馬小定理)

HDU 6400(費馬小定理)

傳送門

題面:

Freshmen frequently make an error in computing the power of a sum of real numbers, which usually origins from an incorrect equation (m+n)p=mp+np, where m,n,p are real numbers. Let's call it ``Beginner's Dream''. 

For instance, (1+4)2=52=25, but 12+42=17≠25. Moreover, √9+16=√25=5, which does not equal 3+4=7. 

Fortunately, in some cases when p is a prime, the identity 
(m+n)p=mp+np
holds true for every pair of non-negative integers m,n which are less than p, with appropriate definitions of addition and multiplication. 

You are required to redefine the rules of addition and multiplication so as to make the beginner's dream realized. 

Specifically, you need to create your custom addition and multiplication, so that when making calculation with your rules the equation (m+n)p=mp+np is a valid identity for all non-negative integers m,n less than p. Power is defined as 
ap={1,p=0ap−1⋅a,p>0

Obviously there exists an extremely simple solution that makes all operation just produce zero. So an extra constraint should be satisfied that there exists an integer q(0<q<p) to make the set {qk|0<k<p,k∈Z} equal to {k|0<k<p,k∈Z}. What's more, the set of non-negative integers less than p ought to be closed under the operation of your definitions. 

Hint


Hint for sample input and output: 
From the table we get 0+1=1, and thus (0+1)2=12=1⋅1=1. On the other hand, 02=0⋅0=0, 12=1⋅1=1, 02+12=0+1=1. 
They are the same. 

Input

The first line of the input contains an positive integer T(T≤30) indicating the number of test cases. 

For every case, there is only one line contains an integer p(p<210), described in the problem description above. p is guranteed to be a prime. 

Output

For each test case, you should print 2p lines of p integers. 

The j-th(1≤j≤p) integer of i-th(1≤i≤p) line denotes the value of (i−1)+(j−1). The j-th(1≤j≤p) integer of (p+i)-th(1≤i≤p) line denotes the value of (i−1)⋅(j−1). 

Sample Input

1
2

Sample Output

0 1
1 0
0 0
0 1

題意:

    給一個質數p,讓你重定義加法和乘法,使得對於任意的n,m屬於[0,p-1],滿足式子

,最後,對於1到p行,你將要輸出第i行與第j列的數相加的結果(其中);對於第p+1行到2p行,你將要輸出第i行與第j列相乘的結果,(其中)

題目分析:

    這是一個被隱藏得很深的數論問題。題意相對來說比較難懂,但是明白題意之後,其實這個題目做起來並不困難。

    首先題目要求我們滿足式子,思考題目中給我們的p是素數,因此我們不難想到費馬小定理,故對於等式兩邊同時mod p可得:

    

    因此我們只需要在加法和乘法的過程中取個模數p即是最終答案。

程式碼:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int T,p;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&p);
        for(int i=0;i<p;i++){
            for(int j=0;j<p-1;j++){
                printf("%d ",(i+j)%p);
            }
            printf("%d\n",(i+p-1)%p);
        }
        for(int i=0;i<p;i++){
            for(int j=0;j<p-1;j++){
                printf("%d ",(i*j)%p);
            }
            printf("%d\n",(i*(p-1))%p);
        }
    }
    return 0;
}