目录
原题链接:
原题:
在B题上,所有的东西都对了,就差一个知识点
2需要特判一下,不知道为什么2没有逆元,希望有大佬可以解释一下
我的代码:
int n,m;cin>>n>>m;
for(int i=0;i<n;++i){
cin>>c[i];
}
//a,b前后对称
//前后对称验证得来的
//2没有逆元,需要特判
if(m==2){
for(int i=0;i<n;++i){
if(c[i]!=c[n-i-1]){//必须一样,要不然没法整除
cout<<"No"<<'\n';
return ;
}
}cout<<"Yes"<<'\n';
for(int i=0;i<n;++i){
cout<<c[i]<<' ';//完全一样
}cout<<'\n';
for(int i=0;i<n;++i){
cout<<0<<' ';//都是一个数
}cout<<'\n';
return ;
}
for(int i=0;i<=n/2;++i){
int sum=c[i]+c[n-i-1];
int ch=c[i]-c[n-i-1];
a[i]=a[n-i-1]=(sum%m*ksm(2,m-2,m)%m)%m;
b[i]=((ch%m+m)%m*ksm(2,m-2,m)%m)%m;
b[n-i-1]=(m-b[i])%m;
}
bool ff=0;
for(int i=0;i<n;++i){
if((c[i]+m)%m!=((a[i]+b[i])%m+m)%m){
cout<<"No"<<'\n';
return ;
}
}
cout<<"Yes"<<'\n';
for(int i=0;i<n;++i){
cout<<a[i];
if(i!=n-1)cout<<' ';
}cout<<'\n';
for(int i=0;i<n;++i){
cout<<b[i];
if(i!=n-1)cout<<' ';
}cout<<'\n';