12
首先构造题目一般都很难想到,所以我们先打上一个暴力,把序列以及模数输出
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000;
int a[N];
int main()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
a[j]=j;
do{
if(!check(i)) continue;
printf("OK:");
for(int j=1;j<=i;j++)
printf("%d ",a[j]);
int sum=0;
puts("");
for(int j=1;j<=i;j++)
{
sum+=a[j];
sum%=i;
printf("%d ",sum);
}
puts("");
puts("");
}while(next_permutation(a+1,a+i+1));
}
return 0;
}
输出之后可以很明显的发现两点:奇数(除了1)不可能,合法序列第一个数一定是
上面的发现提示我们分奇偶讨论,对于模意义下的加法,任何一个加数加减
然后就会发现一个鹤立鸡群的数列:
同理写上暴力程序
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4e5+10;
int n;
struct Node
{
ll x,y;
}temp[N],w[N];
int a[N];
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
bool check(int n)
{
int sum=1;
bool mark[20];
memset(mark,0,sizeof(mark));
for(int i=1;i<=n;i++)
{
sum*=a[i];
sum%=n;
if(mark[sum]) return 0;
mark[sum]=1;
}
return 1;
}
int main()
{
for(int i=1;i<=9;i++)
{
for(int j=1;j<=i;j++)
a[j]=j;
do{
if(!check(i)) continue;
printf("OK:");
for(int j=1;j<=i;j++)
printf("%d ",a[j]);
int sum=1;
puts("");
for(int j=1;j<=i;j++)
{
sum*=a[j];
sum%=i;
printf("%d ",sum);
}
puts("");
puts("");
}while(next_permutation(a+1,a+i+1));
}
return 0;
}
这就很容易发现,除了1和4,必须要质数才可以,而且有一个模序列鹤立鸡群
1 2 3 ... n-1 0
所以我们尝试构造这个序列,就是
由于
这是一个线性同余方程,我们写成
通解为
同理我们把
同理可以得到
以上启发我们,如果有
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构