2017百度之星初赛(A)1001,1005,1006解题报告
1001 小C的倍数问题
纯签到题,求p-1的因数个数,暴力枚举即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 ios::sync_with_stdio(false); 6 int t,p,cnt,n,num; 7 cin>>t; 8 while(t--) 9 { 10 cnt=0; 11 cin>>p; 12 n=p-1; 13 for(int i=1;i*i<=n;++i){ 14 if(n%i==0){ 15 cnt++; 16 if(i*i!=n) 17 cnt++; 18 } 19 } 20 cout<<cnt<<endl; 21 } 22 return 0; 23 }
1005 今夕何夕
利用蔡勒公式,可以知道任何一天的星期数,特判一下闰年的2.29就可以了。枚举年数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int Cal(int y,int m,int d) 4 { 5 int c,w; 6 bool flag=false; 7 if(y%400==0||(y%4==0&&y%100!=0)) 8 flag=true; 9 if(flag==false&&m==2&&d==29) 10 return -1; 11 if(m<=2){ 12 y--; 13 m+=12; 14 } 15 c=y/100; 16 y%=100; 17 w=y+y/4+c/4-2*c+13*(m+1)/5+d-1; 18 while(w<0) 19 w+=7; 20 w%=7; 21 return w; 22 } 23 int main() 24 { 25 //freopen("in.txt","r",stdin); 26 int t,y,m,d,w,c,n; 27 scanf("%d",&t); 28 while(t--) 29 { 30 scanf("%d-%d-%d",&y,&m,&d); 31 w=Cal(y,m,d); 32 while(1) 33 { 34 ++y; 35 n=Cal(y,m,d); 36 if(w==n) 37 break; 38 } 39 printf("%d\n",y); 40 } 41 return 0; 42 }
1006 度度熊的01世界
把第一个遇到的1用dfs赋值为2,然后扫一遍图看是否有1,如果有就说明有多块1,输出-1。
然后再把图扫一遍,碰到0就进去dfs。如果在任何一次整个dfs过程中没有碰到边界,说明这一块0是被1包围的。然后再继续找,如果有多个0被1包围,则输出-1,如果只有一个输出0,一个都没有输出1。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=110; 4 char g[maxn][maxn]; 5 int n,m; 6 int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; 7 bool visit[maxn][maxn]; 8 bool flag_1; 9 bool check(int x,int y) 10 { 11 if(x<1||x>n||y<1||y>m) 12 return false; 13 return true; 14 } 15 void dfs(int x,int y) 16 { 17 int dx,dy; 18 g[x][y]='2'; 19 visit[x][y]=false; 20 for(int i=0;i<4;++i){ 21 dx=x+dis[i][0]; 22 dy=y+dis[i][1]; 23 if(check(dx,dy)) 24 if(g[dx][dy]=='1'&&visit[dx][dy]) 25 dfs(dx,dy); 26 } 27 } 28 bool solve1() 29 { 30 for(int i=1;i<=n;++i) 31 for(int j=1;j<=m;++j){ 32 if(g[i][j]=='1'){ 33 return false; 34 } 35 } 36 return true; 37 } 38 void Searc(int x,int y) 39 { 40 visit[x][y]=false; 41 int dx,dy; 42 for(int i=0;i<4;++i){ 43 dx=x+dis[i][0]; 44 dy=y+dis[i][1]; 45 if(check(dx,dy)){ 46 if(visit[dx][dy]) 47 Searc(dx,dy); 48 } 49 else 50 flag_1=false; 51 } 52 } 53 bool is_one() 54 { 55 56 for(int i=1;i<=n;++i) 57 for(int j=1;j<=m;++j){ 58 if(g[i][j]=='0'&&visit[i][j]){ 59 flag_1=true; 60 Searc(i,j); 61 if(flag_1) 62 return true; 63 } 64 } 65 return false; 66 } 67 int main() 68 { 69 ios::sync_with_stdio(false); 70 //freopen("in.txt","r",stdin); 71 while(cin>>n>>m) 72 { 73 memset(g,0,sizeof(g)); 74 memset(visit,true,sizeof(visit)); 75 for(int i=1;i<=n;++i) 76 cin>>g[i]+1; 77 bool flag=false; 78 for(int i=1;i<=n;++i){ 79 for(int j=1;j<=m;++j) 80 if(g[i][j]=='1'){ 81 flag=true; 82 dfs(i,j); 83 break; 84 } 85 if(flag) 86 break; 87 } 88 if(flag==false||(!solve1())){ 89 cout<<-1<<endl; 90 continue; 91 } 92 if(!is_one()) 93 cout<<1<<endl; 94 else if(is_one()) 95 cout<<-1<<endl; 96 else 97 cout<<0<<endl; 98 } 99 return 0; 100 }