异次元空间
最优题解
这道题首先要解决:最少经过几天,一个异次元空间会存在恰好k个物质
相当于求满足的最小的x。利用扩展欧几里得解同余方程可得。
那么牛牛只要在那天把空间冻上就可以了。
现在可以考虑二分答案,检查是否有m个空间的x是大于等于mid的。
当然直接排序后取第m小也是可以的
时间复杂度
算出来的天数可以存储在原本的a数组中,不使用额外空间,所以空间复杂度
long long exgcd(long long a,long long b,long long& x,long long &y){ if(b==0) { x=1;y=0; return a; } long long x1,y1; long long ans=exgcd(b,a%b,x1,y1); x=y1; y=x1-a/b*y1; return ans; } int solve(int n, int m, int P, vector<int> &a, vector<int> &d, int k){ assert(a.size() == n); assert(d.size() == n); for(int i = 0; i < n; ++i){ long long x, y; exgcd(d[i], P, x, y); x%=P; x = x*(k-a[i]+P)%P; x = (x+P)%P; a[i] = x; } int l = 0, r = P; int ans; while(l <= r){ int mid = (r+l)/2; int cnt = 0; for(int i = 0; i < n; ++i) if(a[i] <= mid) cnt++; if(cnt < m) l = mid+1; else ans = mid, r = mid-1; }return ans; }