原题地址:http://uoj.ac/problem/525
这是一道构造题,如果知道原根的话就容易想出来,不知道就很难做了。
题目为质数以及
的排列已经暗示了要用原根(因为原根可以构造出一个排列,不会的可以去查查定义),那么怎么证明不会构成平行四边形呢?
使用反证法,考虑四个点,不妨设
,若为平行四边形,则:
即:
由于
故
即:,不成立。
证毕。
那么只需要枚举找到原根,然后直接输出即可,时间复杂度为
.
代码:
#include<cstdio>
using namespace std;
int t,n;
int quickpower(int a,int b)
{
int t = 1;
while (b)
{
if (b & 1)
t = t * a % (n + 1);
a = a * a % (n + 1);
b >>= 1;
}
return t;
}
int find(int m)
{
for (int i = 2;i < m;i ++)
{
bool flag = false;
for (int j = 1;j < m - 1;j ++)
if (quickpower(i,j) == 1)
{
flag = true;
break;
}
if (!flag)
return i;
}
}
int main()
{
scanf("%d",&t);
while (t --)
{
scanf("%d",&n);
int g = find(n + 1);
for (int i = 1;i <= n;i ++)
printf("%d %d\n",i,quickpower(g,i));
}
return 0;
}