A A A题:
int a=2019*2019;
for(int i=2020;;i++){
int x=2*i*i-a;
int y=sqrt(x);
if(y*y==x&&i<y){
cout<<i+y<<endl;break;
}
}
B B B题:
背包问题可用记忆化搜索或者 d p dp dp解决。
记忆化搜索:
int p[N],cnt;
bool vis[N];
void ss(){
for(int i=2;i<=2019;i++){
if(!vis[i]) p[cnt++]=i;
for(int j=0;j<cnt&&i*p[j]<=2019;j++){
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
ll dp[N][N];
ll dfs(int pos,int s){
if(~dp[pos][s]) return dp[pos][s];
if(s==2019) return 1; //注意这一句要在下面的if一句前面 不然如果pos=cnt+1&&s==2019 就返回0了
if(pos>=cnt||s>2019) return 0;
ll ans=0;
ans+=dfs(pos+1,s);
ans+=dfs(pos+1,s+p[pos]);
return dp[pos][s]=ans;
}
int main(){
ss();
mst(dp,-1);
printf("%lld\n",dfs(0,0));
return 0;
}
d p dp dp:
int p[N],cnt;
bool vis[N];
void ss(){
for(int i=2;i<=2019;i++){
if(!vis[i]) p[cnt++]=i;
for(int j=0;j<cnt&&i*p[j]<=2019;j++){
vis[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
ll dp[N];
int main(){
ss();
dp[0]=1;
for(int i=0;i<cnt;i++){
for(int j=2019;j>=p[i];j--){
dp[j]+=dp[j-p[i]];
}
}
printf("%lld\n",dp[2019]);
}
待更 … … \dots\dots ……