A
思路是尽量折返走,但由于左右步数、上下步数的差值,所以最终位置也必须合法
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,a,b,c,d,x,y;
signed main() {
ios::sync_with_stdio(false);
cin>>t;
while(t--) {
cin>>a>>b>>c>>d>>x>>y;
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(a-b>x-x1||b-a>x2-x||c-d>y-y1||d-c>y2-y||((a+b)&&x1==x2)||((c+d)&&y1==y2)) cout<<"No";
else cout<<"Yes";
cout<<endl;
}
}
B
按最小质因子排序,然后贪心能选就选即可
#include <bits/stdc++.h>
using namespace std;
const int N = 1005;
struct item {
int id,val,t;
bool operator < (const item &b) {
return t<b.t;
}
} it[N];
int t,n,a[N],b[N],c[N],d[N];
signed main() {
cin>>t;
for(int i=2;i<=1000;i++) {
for(int j=2;j<=i;j++) if(i%j==0) {
b[i]=j;
break;
}
}
while(t--) {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {
it[i]={i,a[i],b[a[i]]};
}
sort(it+1,it+n+1);
for(int i=1;i<=n;i++) a[i]=it[i].val;
for(int i=1;i<=n;i++) c[i]=0;
for(int i=1;i<=15;i++) {
vector <int> vec;
for(int j=1;j<=n;j++) if(c[j]==0) {
int fg=1;
for(int k:vec) if(__gcd(k,a[j])==1) fg=0;
if(fg) vec.push_back(a[j]), c[j]=i;
}
if(vec.size()==0) {
cout<<i-1<<endl;
for(int j=1;j<=n;j++) d[it[j].id]=c[j];
for(int j=1;j<=n;j++) cout<<d[j]<<" ";
cout<<endl;
break;
}
}
}
}
C
构成串的 (n/k) 个单元必须都是回文串,暴力枚举半个单元,每一位相互独立,确定了半个单元后,整个串也就确定了
#include <bits/stdc++.h>
using namespace std;
int t,n,k;
const int N = 200005;
char s[N];
int a[N][26];
signed main() {
cin>>t;
while(t--) {
cin>>n>>k>>s;
for(int i=0;i<n;i++) for(int j=0;j<26;j++) a[i][j]=0;
for(int i=0;i<n;i++) a[i%k][s[i]-'a']++;
int ans=0;
for(int i=0;i<k/2;i++) {
int tans=1e9;
for(int j=0;j<26;j++) {
int tmp=2*(n/k)-a[i][j]-a[k-i-1][j];
tans=min(tans,tmp);
}
ans+=tans;
}
if(k&1) {
int tans=1e9;
int i=k/2;
for(int j=0;j<26;j++) {
int tmp=(n/k)-a[i][j];
tans=min(tans,tmp);
}
ans+=tans;
}
cout<<ans<<endl;
}
}
D
构造 (2 imes 3) 矩阵如下(二进制)
[egin{matrix}
11 & 01 & 00 \ 10 & 11 & 01
end{matrix}
]
这样可以使得答案的差为 (1)。将最后一位替换成需要的数即可
#include <bits/stdc++.h>
using namespace std;
int k;
int main() {
cin>>k;
if(k==0) cout<<"1 1"<<endl<<"1"<<endl;
else {
int t=1;
while(t<=k) t*=2;
cout<<"2 3"<<endl<<t+k<<" "<<k<<" "<<0<<endl<<t<<" "<<t+k<<" "<<k<<endl;
}
}
E
首先观察到,如果 (nm) 是奇数,一定合法;如果 (nm) 是偶数,则当且仅当 (sum_{(i,j)} a_{i,j}) 是偶数时合法
(nm) 是奇数的方案数位 ((r-l+1)^{nm})
(nm) 是偶数时,若 (r-l+1) 是偶数,则所有方案中总和奇偶各占据一半,故 ((r-l+1)^{nm}/2);若 (r-l+1) 是奇数,则显然总和为偶数的比总和为奇数的方案数多 (1),于是答案为 (((r-l+1)^{nm}+1)/2)
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 998244353;
int n,m,l,r,k;
int qpow(int p,int q) {
return (q&1?p:1) * (q?qpow(p*p%mod,q/2):1) % mod;
}
signed main() {
cin>>n>>m>>l>>r;
k=r-l+1;
if(n*m%2) cout<<qpow(k,n*m);
else if(k&1) cout<<(qpow(k,n*m)+1)*((mod+1)/2)%mod;
else cout<<(qpow(k,n*m))*((mod+1)/2)%mod;
}