void solve()
{
int n;
cin>>n;
string s,ss,sss,ssss;//用c的话就是开3个char数组分别存对应的字符按顺序输出即可
cin>>s;
for(int i=0;i<n;i++)
{
if(s[i]>='a'&&s[i]<='z') ss+=s[i];
else if(s[i]>='0'&&s[i]<='9') sss+=s[i];
else ssss+=s[i];
}
cout<<ss<<sss<<ssss<<endl;
}
void solve() {
int n;
cin>>n;
vector<int> a(n);
map<int,int> mp; //mp[i]表示长度为i的棍子个数
for(auto &i:a) cin>>i,mp[i]++; //遍历数组a进行输入,建议自己百度了解掌握
sort(all(a));
for(int i=0;i<n;++i){
if(mp[a[i]]>=3){ //显然构成三角形是最短的
cout<<"yes\n"<<a[i]*3<<'\n';
return;
}
}
cout<<"no\n";
}
void solve() {
vector<int> a(3);
for(auto &i:a) cin>>i;
sort(a.begin(),a.end());
//分析发现把一对不同的变成和他们都不同的颜色,新变成的颜色数量净增加3
//那么只有数量差3的倍数或者本来就相等的才可以
if((a[1]-a[0])%3&&(a[2]-a[1])%3&&(a[2]-a[0])%3) No;
else Yes;
}
void solve() //dijkstra板子题,建议b站看视频学习
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int x, y, z;
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
memset(ans, 0x3f3f3f, sizeof ans);
ans[1] = 0;
priority_queue<pii, vector<pii>, greater<pii>> q;
q.push({0, 1});
while (q.size()) {
auto [w, x] = q.top();
q.pop();
for (auto [dx, dy] : g[x]) {
if (ans[x] + dy < ans[dx]) {
ans[dx] = ans[x] + dy;
q.push({ans[dx], dx});
}
}
}
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += ans[i];
}
cout << sum << endl;
}
int qmi(int a, int b) //快速幂
{
int ans = 1;
while (b) {
if (b & 1) ans = ans * a % mod;
a = a * a % mod;
b >>= 1;
}
return ans % mod;
}
void solve()
{
int x, y;
cin >> x >> y;
cout << qmi(x % mod, y) << endl; //注意x要提前取模
}
void solve() { //线性筛
int n,ans=0;
cin>>n;
std::vector<int> minp, primes; //素数表
minp.assign(n + 1, 0);
primes.clear();
for (int i = 2; i <= n; i++) { //会覆盖小于n所有的素数的倍数即所有非素数
if (minp[i] == 0) { //是素数
minp[i] = i;
primes.push_back(i);
}
for (auto p : primes) {
if (i * p > n) {
break;
}
minp[i * p] = p;
if (p == minp[i]) {
break;
}
}
}
for(auto i:primes) ans+=i;
cout<<ans;
}
void solve()
{
int a, b;
cin >> a >> b; //若有a>b,存在gcd(a,b)=gcd(b,a-b),类似更相减损
cout << max(max(a, b) - min(a, b), __gcd(a, b)) << endl;
}
int tree[N]; //树状数组
void update(int x, int k)
{
for (int i = x; i <= N - 1; i += i & -i) {
tree[i] += k;
}
}
int ask(int x)
{
int ans = 0;
for (int i = x; i >= 1; i -= i & -i) {
ans += tree[i];
}
return ans;
}
void solve() //相信了解了树状数组后这题已经无需多言
{
int n;
cin >> n;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
int ans = 0;
for (int i = n; i >= 1; i--) {
ans += ask(a[i] - 1);
update(a[i], 1);
}
cout << ans << endl;
}
void solve() //就是结论题
{ //c>a>b,则有
//gcd(a,b)=gcd(b,a-b)
//gcd(a,b,c)=gcd(b,a-b,c-a)
int n, m;
cin >> n >> m;
vector<int> a(n + 1), b(m + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= m; i++) cin >> b[i];
int sum = 0;
for (int i = 1; i < n; i++) {
sum = __gcd(sum, abs(a[i] - a[i + 1]));
}
for (int i = 1; i <= m; i++) {
cout << __gcd(sum, a[1] + b[i]) << " ";
}
}