百度(pending)之星 2017 初赛A
数学表达式推一推,可知答案就是求(p-1)的因子数目+2
#include<bits/stdc++.h> using namespace std; int count(int x) { x--; int len=sqrt(x); //printf("shit%d\n",len); int sum=0; for(int i=2;i<=len;i++) { if(x%i==0) { if(x/i==i) sum++; else sum+=2; } } return sum; } int main() { int n,t; while(scanf("%d",&t)==1) { for(int i=1;i<=t;i++) { scanf("%d",&n); // printf("fuck %d\n",count(n)); int ans=2+count(n); printf("%d\n",ans); } } return 0; }
算日期的细节题。需要考虑全面,当然每次做日期题都是差不多的套路。
#include<bits/stdc++.h> using namespace std; const int maxn=20000; int day[maxn]; struct Date { int y;//year int m;//month int d;//day in month }; bool isLeap(int y)//判断是否是闰年 { return y%4==0&&y%100!=0||y%400==0;//真返回为1,假为0 } int daysOfMonth(int y,int m) { int day[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(m!=2) return day[m-1]; else return 28+isLeap(y); } int daysOfDate(Date d)//计算一共的天数 { int days=d.d; days += day[d.y-1]; for(int m=1;m<d.m;m++)//计算月 days+=daysOfMonth(d.y,m); //days+=d.d; return days; } bool judge(Date d2) { if(isLeap(d2.y)==0&&d2.m==2&&d2.d==29) return false; return true; } void init() { day[0] = 0; for(int y=1;y<maxn;y++) day[y] = day[y-1] +365 +isLeap(y); } int main() { Date d1,d2; int t; scanf("%d",&t); init(); while(t--) { scanf("%d-%d-%d", &d1.y, &d1.m, &d1.d); d2.y=d1.y;d2.m=d1.m;d2.d=d1.d; int days1=daysOfDate(d1); while(1) { d2.y++; if(!judge(d2)) continue; int days2=daysOfDate(d2); int ans=days2-days1; if(ans%7==0) break; } printf("%d\n",d2.y); } return 0; }
遍历一下图就能解决的题。根据要求只要提取两个关键信息:1的连通块数目,0的不靠墙连通块数目即可。我的flagy是多余的,可以代替。
#include<bits/stdc++.h> using namespace std; int dir[4][2]={0,1,1,0,-1,0,0,-1}; const int maxn=108; char mp[maxn][maxn]; bool vis[maxn][maxn]; int n,m; bool judge(int x,int y) { if(x<0||x>=n) return false; if(y<0||y>=m) return false; return true; } void dfs1(int x,int y) { int nx,ny; vis[x][y]=true; for(int i=0;i<4;i++) { nx=x+dir[i][0]; ny=y+dir[i][1]; if(judge(nx,ny)&&vis[nx][ny]==false&&mp[nx][ny]=='1') dfs1(nx,ny); } } bool dfs2(int x,int y) { int nx,ny; bool flag=true; for(int i=0;i<4;i++) { nx=x+dir[i][0]; ny=y+dir[i][1]; if(judge(nx,ny)==false) flag=false; } vis[x][y]=true; for(int i=0;i<4;i++) { nx=x+dir[i][0]; ny=y+dir[i][1]; if(judge(nx,ny)&&vis[nx][ny]==false&&mp[nx][ny]=='0') { if(dfs2(nx,ny)==false) flag=false; } } return flag; } int main() { while(scanf("%d%d",&n,&m)==2) { memset(vis,false,sizeof(vis)); for(int i=0;i<n;i++) scanf("%s",mp[i]); int sx,sy; sx=sy=0; bool flagy=false; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(vis[i][j]==false) { if(mp[i][j]=='1') { sx++; dfs1(i,j); } else { if(dfs2(i,j)==true) { sy++; flagy=true; } } } } // printf("%d %d ",sx,sy); if(flagy==false) printf("0\n"); else printf("1\n"); if(sx==1&&sy==1&&flagy==true) printf("0\n"); else if(sx==1&&flagy==false) printf("1\n"); else printf("-1\n"); } return 0; }