B. Modulo Equality

当时想到的第一个想法是用拓展欧几里得解方程,求x的最小正解。一发交了之后发现爆long long,因为m是1e9。

因此本题的正解是暴力,保证有解的情况下,那么a数组中的一个数必然对应着b数组中的一个数,因此,可以遍历数组a,求出b[1]和a[i]对应的x的值,然后再判断是否符合其他元素即可。

要求满足(a+x)%m=b的x的值,可以通过x=((b-a)%m+m)%m,当时就是没有想到这个。

因为求最小值,所有要遍历所有可能。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=2010;
 4 int a[N],b[N];
 5 bool check(int x,int m,int n)
 6 {
 7     int c[N]={0};
 8     for(int i=1;i<=n;i++)
 9         c[i]=(a[i]+x)%m;
10     sort(c+1,c+1+n);
11     for(int i=1;i<=n;i++)
12     {
13         if(b[i]!=c[i])
14             return false;
15     }
16     return true;
17 }
18 int main()
19 {
20     int n,m;
21     while(scanf("%d%d",&n,&m)!=EOF)
22     {
23         for(int i=1;i<=n;i++)
24             scanf("%d",&a[i]);
25         for(int j=1;j<=n;j++)
26             scanf("%d",&b[j]);
27         sort(b+1,b+1+n);
28         int ans=0x3f3f3f3f;
29         for(int i=1;i<=n;i++)
30         {
31             int x=((b[1]-a[i])%m+m)%m;
32             if(check(x,m,n))
33                ans=min(x,ans);
34         }
35         printf("%d\n",ans);
36     }
37     return 0;
38 }
View Code

猜你喜欢

转载自www.cnblogs.com/1024-xzx/p/12109163.html