列表

详情


NC240155. 序列操作

描述

你有一个长度为 n 的序列 ,和两个整数 x, p,特别的,p 是质数。在一次操作中,你可以选择两个整数

再给你一个序列 ,现在想让你找到一个非负整数 x,使得这个 x 在最小操作次数下,序列 A 能变成序列 B 。如果有多个 x,输出最小的。

输入描述

第一行两个整数 ,保证 p 是质数。
第二行 n 个正整数 ,表示序列 A
第三行 n 个正整数 ,表示序列 B

输出描述

一个整数 x

示例1

输入:

4 5
3 3 1 4
2 1 3 2

输出:

4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 788ms, 内存消耗: 22552K, 提交时间: 2022-09-21 20:33:07

#include <iostream>
using namespace std;
const int N = 1e6+10;
int a[N],b[N],c[3510],inv[3510],n,p,x=0,s=N;
int main(){
    cin>>n>>p;
    inv[1] = 1;
    for(int i=2;i<p;i++) inv[i] = (p-p/i)*inv[p%i]%p;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i],c[((b[i]-a[i])%p+p)%p]++;
    for(int i=1;i<p;i++){
        int t = 0;
        for(int j=1;j<p;j++) if(c[j]) t = max(t,j*inv[i]%p);
        if(t&&s>t) s=t,x=i;
    }
    cout<<x<<endl;
    return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 903ms, 内存消耗: 4344K, 提交时间: 2022-09-26 10:47:29

#include<bits/stdc++.h>
using namespace std;
int n,i,j,y,x,p,o,r,t[3500],I[3500];
int main(){
  cin>>n>>p;vector<int>a(n);
  for(int&v:a)cin>>v,v%=p;
  for(int&v:a)cin>>i,t[(i+p-v)%p]=1,o|=i^v;
  if(!o)cout<<0,exit(0);
  for(i=1;i<p;++i)for(t[i]*=I[i]=i,
    j=p-3;j--;I[i]=I[i]*i%p);
  for(r=p,i=1;i<p;y<r&&(r=y,x=i),++i)
    for(y=0,j=1;j<p;++j)y=max(y,I[i]*t[j]%p);
  cout<<x;
}

上一题