2017百度之星

来源:互联网 发布:淘宝户外用品店推荐 编辑:程序博客网 时间:2024/06/05 08:27

今天这服务器。。。。

第一题,百度一波儿定理,然后发现就是让求p-1的因子

#include<cstdio>int main(){    int p;    int cases; scanf("%d",&cases);    while(cases--)    {        scanf("%d",&p);        p--;        int ans = 0;        for(int i=1;i*i<=p;i++)        {            if(p%i==0)            {                if(i!=p/i) ans+=2;                else ans+=1;            }        }        printf("%d\n",ans);    }    return 0;}

第五题 暴力啊! 每次day++取模,特判2月就好

#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int n,m;char s[20];int monthday[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};int main(){    int cases; int year,month,day;    scanf("%d",&cases);    while(cases--)    {        scanf("%s",s);        year = (s[0]-48)*1000+(s[1]-48)*100+(s[2]-48)*10+(s[3]-48);        month = (s[5]-48)*10+(s[6]-48);        day = (s[8]-48)*10+(s[9]-48);        int ansmonth = month; int ansday = day;        while(1)        {            int tmp = monthday[2];            if((year%4==0&&year%100!=0)||year%400==0)                tmp+=1;            day += 7;            if(month==2&&day>tmp)            day%=tmp,month+=1;            else if(month!=2&&day>monthday[month])            {                day%=monthday[month]; month++;            }            if(month>12) month%=12,year++;            if(month==ansmonth&&day==ansday)            {                printf("%d\n",year);                break;            }        }    }    return 0;}

第6题,第一遍dfs看有没有1,没有直接输出-1.第二遍看有几个在边界的 0,是1的话输出0,是0的话输出1,否则输出-1.

#include<cstdio>#include<cstring>int n,m;char str[105][105];int vis[105][105];int dir[4][2] = {0,1,0,-1,1,0,-1,0};void dfs(int x,int y){    vis[x][y] = 1;   // printf("%d %d\n",x,y);    for(int i=0;i<4;i++)    {        int nx = x+dir[i][0];        int ny = y+dir[i][1];        if(nx<0||nx>=n||ny<0||ny>=m) continue;        if(vis[nx][ny]||str[nx][ny]=='0') continue;        dfs(nx,ny);    }}int flag = 1;void dfs2(int x,int y){    //printf("%d %d\n",x,y);    if(x==0||x==n-1||y==0||y==m-1) flag = 0;    vis[x][y] = 1;    for(int i=0;i<4;i++)    {        int nx = x+dir[i][0];        int ny = y+dir[i][1];        if(nx<0||nx>=n||ny<0||ny>=m) continue;        if(vis[nx][ny]||str[nx][ny]=='1') continue;        dfs2(nx,ny);    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        for(int i=0;i<n;i++)            scanf("%s",str[i]);        //for(int i=0;i<n;i++) printf("%s",str[i]);        int cnt1 = 0;        memset(vis,0,sizeof(vis));        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(!vis[i][j]&&str[i][j]=='1')                    {dfs(i,j);cnt1++;}            }        }       // printf("%d\n",cnt1);        if(cnt1!=1)        {            printf("-1\n");            continue;        }        memset(vis,0,sizeof(vis));        int cnt0 = 0;  int f = 0;        for(int i=0;i<n;i++)        {            for(int j=0;j<m;j++)            {                if(!vis[i][j]&&str[i][j]=='0'){                    flag = 1;                    dfs2(i,j);                    if(flag==1) f++;                    cnt0++;                }            }        }        if(f==1)        {            printf("0\n");            continue;        }        if(f==0) printf("1\n");        else printf("-1\n");    }    return 0;}

ACfun里有人说第二题数据有问题。第二题WA了两次,不知道为什么,应该就是一个镜像并查集啊啊啊。由于服务器的原因 让我一份AC的代码交了多次还要算罚时!!坑爹啊。