Koxia and Whiteboards
Statement
Kiyora 有nnn块白板,从111 到nnn 编号。初始情况下, 第iii 块白板上写着一个整数aia_iai 。
Koxia 要进行 mmm次操作。第jjj 次操作是,选择一块白板并将上面的整数修改为bjb_jbj 。
计算全部操作后所有白板上数字之和的最大可能值。
每次操作修改最小的数。
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll a[101010];
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--){
int n=read(),m=read();
if(n==1) {
For(i,n+m) cin>>a[i];
cout<<a[n+m]<<endl;
continue;
}
priority_queue<ll, vector<ll>, greater<ll> > q;
For(i,n) {
q.push(read());
}
For(i,m) q.pop(),q.push(read());
ll ans=0;
while(!q.empty()) ans+=q.top(),q.pop();
cout<<ans<<endl;
}
return 0;
}
Koxia and Permutation
Statement
Reve 有两个整数nnn 和kkk 。
对于一个长度为 nnn的排列 ppp,我们令ccc 是一个长度为 n−k+1n-k+1n−k+1的数组,其中
。
ci=max(pi,⋯ ,pi+k−1)+min(pi,⋯ ,pi+k−1)c_i = max(p_i,\cdots, p_{i+k-1})+min(p_i,\cdots, p_{i+k-1})ci=max(pi,⋯,pi+k−1)+min(pi,⋯,pi+k−1)
定义一个排列ppp 的代价是ccc 中的最大值。
Koxia 希望你构造一个排列使得其代价尽可能小。
Statement
Joi 有一个数组 aaa,包含nnn 个正整数。Koxia 希望你判定是否存在一个正整数xxx 使得gcd(ai+x,aj+x)=1gcd(a_i+x,a_j+x)=1gcd(ai+x,aj+x)=1
对于所有1≤i<j≤n1\le i \lt j \le n1≤i<j≤n 都成立。
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll a[101010];
int main()
{
// freopen("A.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--){
int n=read(),m=read();
int b=n,a=1;
For(i,n) if(i%m==0) {
cout<<a++<<' ';
} else cout<<b--<<' ';
cout<<endl;
}
return 0;
}
Koxia and Number Theory
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
set<int> aa[101];
set<int> bb[101];
ll a[101];
bool work() {
int n=read();
For(i,n) cin>>a[i];
sort(a+1,a+1+n);
bool fl=1;
For(i,n-1) if(a[i]==a[i+1]) {
return 0;
}
For(i,n) aa[i].clear(),bb[i].clear();
For(i,n) {
Fork(j,2,n) {
int t=a[i]%j;
if (aa[j].find(t)!=aa[j].end()) {
bb[j].insert(t);
} else {
aa[j].insert(t);
}
}
}
Fork(j,2,n) if (bb[j].size()==j) return 0;
return 1;
}
int main()
{
int T=read();
while(T--){
bool fl=work();
puts(fl?"YES":"NO");
}
return 0;
}
Koxia and Game
Koxia 和 Mahiru 正在用三个长度为 nnn的数组 a,b,ca,b,ca,b,c 玩一个游戏。其中 a,b,ca,b,ca,b,c中的每个元素都是 111到 nnn 之间的整数。
游戏持续 nnn 轮。在第iii 轮中,她们进行以下操作:
令 SSS是{ai,bi,ci}\{ a_i,b_i,c_i \}{ai,bi,ci} 的可重集。
Koxia 从可重集 SSS中选择一个元素并移除。
Mahiru 从可重集 SSS 的剩余两个元素中选择一个元素。
记 did_idi是第 iii 轮中 Mahiru 选择的元素。如果ddd 是一个排列 ,则 Koxia 获胜;否则 Mahiru 获胜。
现在,只有 aaa和bbb 两个数组是已经确定的。作为 Koxia 的支持者,你希望选择合适的数组ccc 使得 Koxia 获胜。计算这样的ccc 的数量,输出其对998244353 取模后的结果。
Koxia 和 Mahiru 会以最优方式行动。
ccc满足条件当且仅当
∀i∈[1,n]⋂Z,∃p∈[1,n]⋂Z,(ap==i)+(bp==i)+(cp==i)>1\forall i \in [1,n]\bigcap Z, \exists p\in [1,n]\bigcap Z,(a_p==i)+(b_p==i)+(c_p==i)>1∀i∈[1,n]⋂Z,∃p∈[1,n]⋂Z,(ap==i)+(bp==i)+(cp==i)>1
所以对于每个数xxx,ai,bia_i,b_iai,bi出现次数为0次时,无解
1次时,对应位置的ci=xc_i=xci=x
出现3次或以上,那么至少有一个数出现至多1次,找出它能至少再填一个数。最后考虑每个数出现2次的情况,那么由于每个数出现两次,我们将a,b对应的相同数连线,分两种情况 :
ai=bia_i=b_iai=bi情况下cic_ici填任意数
ai!=bia_i!=b_iai!=bi此时环长度大于2,cic_ici只有2种填法(aia_iai or bib_ibi)且环中其他位置的cic_ici也确定了。
答案=2长度大于2的环的个数∗n长度等于2的环的个数=2^{长度大于2的环的个数}*n^{长度等于2的环的个数}=2长度大于2的环的个数∗n长度等于2的环的个数
#include<bits/stdc++.h>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (998244353)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int>
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \
For(j,m-1) cout<<a[i][j]<<' ';\
cout<<a[i][m]<<endl; \
}
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{
int x=0,f=1; char ch=getchar();
while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
ll a[3][112345];
int deg[112345];
set<pair<int,int> > h[112345];
int n;
ll ans[112345];
ll work() {
n=read();
For(i,n) ans[i]=deg[i]=0;
For(j,2)For(i,n){
int t=read();
a[j][i]=t;
deg[t]++;
h[t].insert(mp(j,i));
}
queue<int> q;
For(i,n) {
if(!deg[i]) return 0;
if(deg[i]==1) {
q.push(i);
}
}
while(!q.empty()) {
int p=q.front();q.pop();
deg[p]--;
auto it = h[p].begin();
auto pa=*it;
h[p].erase(it);
ans[pa.se]=p;
int afi=3-pa.fi;
int p2=a[afi][pa.se];
deg[p2]--;
h[p2].erase(mp(afi,pa.se));
if(deg[p2]==0) return 0;
else if(deg[p2]==1) q.push(p2);
}
ll aa=1;
For(i,n) if(deg[i]==2) {
int p=i,c=0;
while(deg[p]>0) {
deg[p]--;
auto it = h[p].begin();
auto pa=*it;
h[p].erase(it);
int afi=3-pa.fi;
int p2=a[afi][pa.se];
deg[p2]--;
h[p2].erase(mp(afi,pa.se));
p=p2;
c+=2;
}
if(c==2) aa=mul(aa,n);
else aa=mul(aa,2);
}
return aa;
}
int main()
{
// freopen("D.in","r",stdin);
// freopen(".out","w",stdout);
int T=read();
while(T--){
ll an=work();
cout<<an<<endl;
For(i,n) h[i].clear();
}
return 0;
}