T4
题目大意:求 中有多少个数能被 个 中的至少一个整除
由于 十分小,经典 容斥即可
import java.util.*;
public class zbr01
{
static long []a=new long[50005];
public static long pw(long a,long b)
{
long ans=1,base=a;
while(b!=0)
{
if(b%2==1) ans=(ans*base);
base=(base*base); b>>=1;
}
return ans;
}
public static long gcd(long a,long b)
{
return b==0?a:gcd(b,a%b);
}
public static void main(String[] args)
{
Scanner S=new Scanner(System.in);
long n=S.nextLong(),m=S.nextLong();
for(int i=1;i<=m;i++) a[i]=S.nextInt();
long ed=pw(2,m),ans=n;
for(int i=1;i<ed;i++)
{
long cnt=0,tmp=1;
for(int j=1;j<=m;j++)
{
if((i&(1<<(j-1)))!=0)
{
cnt++;
tmp=tmp/gcd(tmp,a[j])*a[j];
}
}
if(cnt%2==1) ans-=(n/tmp);
else ans+=(n/tmp);
}
System.out.println(n-ans);
}
}
T1
大模拟板子题…略略略
import java.util.*;
public class zbr01
{
static int [][]a=new int[505][505];
public static void main(String[] args)
{
Scanner S=new Scanner(System.in);
int n=S.nextInt(),p=n/2;
for(int i=1;i<=n/2;i++) for(int j=1;j<=n/2;j++) if(i<j) a[i][j]=2; else if(i>j) a[i][j]=3;
for(int i=(n+1)/2+1;i<=n;i++) for(int j=1;j<=n/2;j++)
if((n-i+1)<j) a[i][j]=5; else if((n-i+1)>j) a[i][j]=4;
for(int i=(n+1)/2+1;i<=n;i++) for(int j=(n+1)/2+1;j<=n;j++)
if((n-i+1)<(n-j+1)) a[i][j]=6; else if((n-i+1)>(n-j+1)) a[i][j]=7;
for(int i=1;i<=n/2;i++) for(int j=(n+1)/2+1;j<=n;j++)
if(i<(n-j+1)) a[i][j]=1; else if(i>(n-j+1)) a[i][j]=8;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) System.out.print(a[i][j]);
System.out.println();
}
}
}
T2
bfs大模拟板子…略略略
import java.util.*;
public class zbr01
{
static int [][]a=new int[405][405];
static int [][]col=new int[405][405];
static int []qx=new int[200005];
static int []qy=new int[200005];
static int []siz=new int[200005];
static int []v=new int[200005];
static int cnt,n,m;
static int []kx={0,0,1,-1};
static int []ky={1,-1,0,0};
public static void bfs(int x,int y)
{
int eh=1,ed=0,eh2=1,ed2=0;
qx[++ed]=x; qy[++ed2]=y;
while(eh<=ed)
{
int u=qx[eh],v=qy[eh2]; eh++; eh2++; col[u][v]=cnt; siz[col[u][v]]++;
for(int i=0;i<=3;i++)
{
int tx=u+kx[i],ty=v+ky[i];
if(tx<=0||tx>n||ty<=0||ty>m||col[tx][ty]!=0||a[tx][ty]==0) continue;
qx[++ed]=tx; qy[++ed2]=ty;
}
}
}
public static void main(String[] args)
{
Scanner S=new Scanner(System.in);
n=S.nextInt(); m=S.nextInt();
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=S.nextInt();
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
if(a[i][j]==1&&col[i][j]==0) {cnt++; bfs(i,j);}
int ans=0;
for(int i=1;i<=cnt;i++) ans=Math.max(ans,siz[i]);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==1) continue;
int tmp=0;
for(int k=0;k<=3;k++)
{
int tx=i+kx[k],ty=j+ky[k];
if(tx<=0||tx>n||ty<=0||ty>m) continue;
if(v[col[tx][ty]]==0)
{
v[col[tx][ty]]=1;
tmp+=siz[col[tx][ty]];
}
}
ans=Math.max(ans,tmp+1);
for(int k=0;k<=3;k++)
{
int tx=i+kx[k],ty=j+ky[k];
if(tx<=0||tx>n||ty<=0||ty>m) continue;
v[col[tx][ty]]=0;
}
}
}
int p2=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) p2+=a[i][j];
System.out.println(Math.min(ans,p2));
}
}
T3
被大模拟板子们恶心到了…也不想写了emm…崩崩崩的80pts代码…丢人现场.jpg
import java.util.*;
public class zbr01
{
static int []dp=new int[1000005];
static int []c=new int[500005];
static int []v=new int[500005];
public static void main(String[] args)
{
Scanner S=new Scanner(System.in);
int n=S.nextInt(),m=S.nextInt(),k=20005;
for(int i=0;i<k;i++) dp[i]=-10000000;
for(int i=1;i<=n;i++)
{
int w=S.nextInt(),v=S.nextInt();
if(w<0)
{
for(int j=0;j<k+m+w;j++)
dp[j]=Math.max(dp[j],dp[j-w]+v);
}
else
{
for(int j=k+m;j>=w;j--)
dp[j]=Math.max(dp[j],dp[j-w]+v);
}
}
int ans=0;
for(int i=k-5;i<=k+m;i++) ans=Math.max(ans,dp[i]);
System.out.println(ans);
}
}