百度(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;
}
浙公网安备 33010602011771号