[AGC063C] Add Mod Operations
Genius_Star · · 题解
或许更好的阅读体验。
思路:
先考虑什么情况无解;其实只有相同的
然后把
那么这样操作
你发现这样得到的前面
考虑钦定一个
则序列会变成
于是想到钦定
但是对于最后那个
于是这样可以在
完整代码:
#include<bits/stdc++.h>
#define fi first
#define se second
#define lowbit(x) x & (-x)
using namespace std;
typedef long long ll;
const int N = 1e3 + 10;
const ll mod = 2e9, lim = 1e18;
inline ll read(){
ll x = 0, f = 1;
char c = getchar();
while(c < '0' || c > '9'){
if(c == '-')
f = -1;
c = getchar();
}
while(c >= '0' && c <= '9'){
x = (x << 1) + (x << 3) + (c ^ 48);
c = getchar();
}
return x * f;
}
inline void write(ll x){
if(x < 0){
putchar('-');
x = -x;
}
if(x > 9)
write(x / 10);
putchar(x % 10 + '0');
}
struct Node{
ll a, b;
inline bool operator<(const Node&rhs)const{
return a < rhs.a;
}
}A[N];
int n, cnt;
ll x[N], y[N];
int main(){
n = read();
for(int i = 1; i <= n; ++i)
A[i].a = read();
for(int i = 1; i <= n; ++i)
A[i].b = read();
sort(A + 1, A + n + 1);
A[0].a = -1; // !!!!
for(int i = 1; i <= n; ++i){
if(A[i].a == A[cnt].a){
if(A[i].b != A[cnt].b){
puts("No");
return 0;
}
}
else
A[++cnt] = A[i];
}
puts("Yes");
write(n = cnt);
putchar('\n');
reverse(A + 1, A + n + 1);
reverse(A + 1, A + n);
for(int i = 2; i < n; ++i){
while(A[i].b < A[i - 1].b)
A[i].b += mod;
}
x[n] = A[1].b, y[n] = mod;
for(int i = 2; i < n; ++i)
x[n - i + 1] = A[i].b - A[i - 1].b;
while(A[n].b - A[n - 1].b < A[n].a)
A[n].b += mod;
x[1] = A[n].b - A[n - 1].b - A[n].a;
// for(int j = 1; j <= n; ++j){
// // A[j].a = (A[j].a + x[i]) % y[i];
// cerr << A[j].a << ' ' << A[j].b << '\n';
// }
// cerr << '\n';
for(int i = 1; i <= n; ++i){
if(i < n)
y[i] = x[i] + A[n - i].a;
// assert(x[i] <= lim && y[i] <= lim && x[i] < y[i] && x[i] >= 0);
write(x[i]);
putchar(' ');
write(y[i]);
putchar('\n');
for(int j = 1; j <= n; ++j){
A[j].a = (A[j].a + x[i]) % y[i];
// cerr << A[j].a << ' ';
}
// cerr << '\n';
}
// for(int j = 1; j <= n; ++j)
// assert(A[j].a == (A[j].b % mod));
return 0;
}