1001.Art Class
1002.Graph Theory Class
Min25篩
1003.Express Mail Taking
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
typedef long long ll;
#define int ll
int n,m,k;
signed main() {
int T,x;
scanf("%lld",&T);
while (T--){
scanf("%lld%lld%lld",&n,&m,&k);
int mi=k,ans=(k-1)*2;
for (int i=1;i<=m;i++){
scanf("%lld",&x);
ans+=abs(k-x)*2;
mi=min(mi,x);
}
ans-=(k-mi)*2;
printf("%lld\n",ans);
}
return 0;
}
1004.Chess Class
1005.Lunch
nim game
2^k必贏,無法必輸,sg=1
奇數,例:9=3*3,有2個因數,相當於一個數量為2的nim game的堆,因為操作后可以變為3+3+3,3與3的sg異或必然為0,可以兩兩相消,只要考慮一個3,9->3->1,sg=奇質因子數
sg(2^k*奇數)=1+奇質因子數
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,k;
int a[N],b[N];
int vis[N],prim[N];
int num;
void euler(int n) {
num=0;
for (int i=2;i<=n;i++) {
if (vis[i]==0)prim[++num]=i;
for (int j=1;j<=num&&prim[j]*i<=n;j++) {
vis[i*prim[j]]=1;
if (i%prim[j]==0)break;
}
}
}
signed main() {
int T;
euler(1e5);
scanf("%d",&T);
while (T--) {
scanf("%d",&n);
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
bool f=0;
while ((a[i]&1)==0) {
a[i]>>=1;
f=1;
}
b[i]=f?1:0;
}
for (int i=1;i<=n;i++) {
for(int j=1;j<=num&&prim[j]*prim[j]<=a[i];j++){
while (a[i]%prim[j]==0){
a[i]/=prim[j];b[i]++;
}
}
if (a[i]>1)b[i]++;
}
int ans=0;
for (int i=1;i<=n;i++)ans^=b[i];
if (ans)puts("W");
else puts("L");
}
return 0;
}
1006.Robotic Class
1007.CCPC Training Class
1008.PE Class
1009.Math Class
1010.Reports
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int n,m,k;
int a[N];
signed main() {
int T;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
bool f=0;
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
if (i>1&&a[i]==a[i-1])f=1;
}
printf(f?"NO\n":"YES\n");
}
return 0;
}
1011.3x3 Convolution
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int n,m,k;
int a[N][N],b[N][N];
signed main() {
int T;
scanf("%d",&T);
while (T--) {
scanf("%d",&n);
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
}
}
int x=0;
for (int i=1;i<=3;i++){
for (int j=1;j<=3;j++){
scanf("%d",&b[i][j]);
x+=b[i][j];
}
}
if (x==b[1][1]){
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (j!=1)printf(" ");
printf("%d",a[i][j]);
}
puts("");
}
}
else{
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++){
if (j!=1)printf(" ");
printf("0");
}
puts("");
}
}
}
return 0;
}
1012.Xor
|x-y|<=k=>x-y+k>=0,y-x+k>=0
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
int a,b,k,w;
int dp[35][3][3][2][2][2];
int dfs(int n,int s1,int s2,int fa,int fb,int fw){
s1=min(s1,1ll);s2=min(s2,1ll);//>=1,之后無法減去,一直>0
if(s1<-1||s2<-1)return 0;//<-1,之后無法加回來,一直<0
if(n<0)return s1>=0&&s2>=0;
if (~dp[n][s1+1][s2+1][fa][fb][fw])return dp[n][s1+1][s2+1][fa][fb][fw];
int upa=fa?(a>>n&1):1;
int upb=fb?(b>>n&1):1;
int upw=fw?(w>>n&1):1;
int ans=0;
int t=(k>>n&1);
for (int i=0;i<=upa;i++){
for (int j=0;j<=upb;j++){
if ((i^j)>upw)continue;
ans+=dfs(n-1,s1*2+i-j+t,s2*2+j-i+t,fa&&i==upa,fb&&j==upb,fw&&(i^j)==upw);
}
}
return dp[n][s1+1][s2+1][fa][fb][fw]=ans;
}
signed main(){
int T;
cin>>T;
while (T--){
cin>>a>>b>>k>>w;
memset(dp,-1,sizeof dp);
int ans=dfs(30,0,0,1,1,1);
cout<<ans<<endl;
}
return 0;
}
1013.Residual Polynomial
模數較大要用NTT