第十一届蓝桥杯
B 扩散
首先考虑到bfs,但最终选择建立矩阵图、逐个染色+扫描,因为这相对前者省空间且易实现。
ans:20312088
1 #include<bits/stdc++.h> 2 #define N 10000 3 using namespace std; 4 bool flg[N][N]; 5 long long ans; 6 int a[4][2]={2020,2020, 7 4040,2031, 8 2031,2034, 9 4020,4020}; 10 11 void work(int x,int y){ 12 for(int i=0;i<=2020;i++) 13 for(int j=2020-i;j>=0;j--){ 14 flg[x+i][y+j]=1; 15 flg[x-i][y+j]=1; 16 flg[x+i][y-j]=1; 17 flg[x-i][y-j]=1; 18 } 19 } 20 21 int main(){ 22 for(int i=0;i<4;i++) 23 work(a[i][0],a[i][1]); 24 for(int i=0;i<=6060;i++) 25 for(int j=0;j<=6060;j++) 26 if(flg[i][j]) 27 ans++; 28 cout<<ans; 29 return 0; 30 }
C 阶乘约数
参考大佬 C题 - 阶乘约束 - 唯一分解定理 - 抓水母的派大星 - 博客园 %%%膜!
ans:39001250856960000
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long ans=1; 4 int a[110]; 5 6 void work(){ 7 for(int i=2;i<=100;i++){ 8 int t=i; 9 for(int j=2;j<=t/j;j++){ 10 for(;t%j==0;t/=j) 11 a[j]++; 12 } 13 if(t>1)a[t]++; 14 } 15 } 16 17 int main(){ 18 work(); 19 for(int i=2;i<=100;i++) 20 if(a[i]) 21 ans*=(a[i]+1); 22 cout<<ans; 23 return 0; 24 }
D 本质上升序列
参考大佬 本质上升序列-python-anderson13的博客 %%%膜!
ans:3616159
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 200 4 long long dp[210],ans; 5 char a[210]; 6 7 int main(){ 8 cin>>a; 9 for(int i=0;i<N;i++){ 10 dp[i]=1; 11 for(int j=0;j<i;j++) 12 if(a[j]<a[i]) 13 dp[i]+=dp[j]; 14 else if(a[j]==a[i]) 15 dp[i]-=dp[j]; 16 ans+=dp[i]; 17 } 18 cout<<ans; 19 return 0; 20 }
不是!哎呀我要裂开了啊,我这oier退役后啥都不会了
我 好 菜 啊 这也太难了
E 玩具蛇
哇 Finally,终于有个会写的暴力了,dfs。
ans:552
#include<bits/stdc++.h> using namespace std; long long ans; bool b[5][5]; int dr[4][2]={ {-1,0}, {0,-1},{0,1}, {1,0}}; void dfs(int x,int y,int t){ if(t==16){ ans++; return; } int x2,y2; b[x][y]=1; for(int i=0;i<4;i++){ x2=x+dr[i][0]; if(x2<=0 || x2>4) continue; y2=y+dr[i][1]; if(y2<=0 || y2>4) continue; if(!b[x2][y2]) dfs(x2,y2,t+1); } b[x][y]=0; } int main(){ for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) dfs(i,j,1); cout<<ans; return 0; }
F 皮亚诺曲线距离
递归
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll POW[110]; ll calc(int k,ll x,ll y){ if(!k) return 0; ll a,b; a=POW[k-1]*POW[k-1]; b=POW[k-1]; if(x<=b){ if(y<=b){ return calc(k-1,x,y); } else if(y<=b*2){ return a+calc(k-1,b+1-x,y-b); } else{ return a*2+calc(k-1,x,y-b*2); } } else if(x<=b*2){ if(y<=b){ return a*5+calc(k-1,x-b,b+1-y); } else if(y<=b*2){ x-=b,y-=b; return a*4+calc(k-1,b+1-x,b+1-y); } else{ y-=b*2; return a*3+calc(k-1,x-b,b+1-y); } } else{ if(y<=b){ return a*6+calc(k-1,x-b*2,y); } else if(y<=b*2){ x-=b*2; return a*7+calc(k-1,b+1-x,y-b); } else{ return a*8+calc(k-1,x-b*2,y-b*2); } } } int main(){ ll a,b,k,x1,y1,x2,y2; cin>>k>>x1>>y1>>x2>>y2; x1++; x2++; y1++; y2++; POW[0]=1; for(int i=1;i<=k;i++) POW[i]=POW[i-1]*3; a=calc(k,x1,y1); b=calc(k,x2,y2); cout<<abs(a-b); return 0; }