特殊日期
记一个日期为 yy 年 mm 月 dd 日,统计从 20002000 年 11 月 11 日(含)到 20000002000000 年 11 月 11 日(含),有多少个日期满足年份 yy 是月份 mm 的倍数,同时也是 dd 的倍数。
当年份是 44 的倍数而不是 100100 的倍数或者年份是 400400 的倍数时,这一年是闰年,其他的年份都不是闰年。
#include <iostream>
using namespace std;
bool f(int year){
return (year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0));
}
int Day[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int DAY(int year,int month){
Day[2]=f(year)?29:28;
return Day[month];
}
int main()
{
int ans=0;
for(int year=2000;year<2000000;year++){
//Day[2]=f(year)?29:28;
for(int month=1;month<=12;month++){
if(year%month==0){
for(int day=1;day<=DAY(year,month);day++){
if(year%day==0)ans++;
}
}
}
}//cout<<ans+1;
cout<<35813063;
return 0;
}
公约移动
小蓝站在一个 n 行 m 列的方格图中间,方格图的每一个方格上都标有一个正整数。
如果两个相邻方格(上下左右四个方向相邻)内的数的最大公约数大于 11 ,则可以从其中一个方格移动到另一个方格,当然也可以从另一个方格移回第一个方格。
假设小蓝开始时站在第 r 行第 c 列,请问小蓝可以移动到方格图内的多少个方格?
输入
输入的第一行包含两个整数 ,n,m ,用一个空格分隔,表示方格图的行数和列数。
接下来 n 行,每行包含 m 个正整数,相邻整数间用一个空格分隔,依次表示方格图中从第 11 行到第 n 行,每行从第 11 列到第 m 列中的数。
接下来一行包含两个整数 ,r,c,用一个空格分隔,表示小蓝所在的行号和列号。
输出
输出一行包含一个整数,表示答案。
样例输入
3 4
3 6 5 5
2 4 3 5
7 8 3 8
3 2
输出
5
code
#include <bits/stdc++.h>
using namespace std;
#define int long long
int mp[1000][1000];
bool vis[1000][1000];
int dx[]={0,0,0,1,-1};
int dy[]={0,1,-1,0,0};
int cnt=0;
int n,m;
void dfs(int x,int y){
vis[x][y]=true;//标记(xx,yy)
cnt++;//cnt放在这里的话,原点也会计入
for(int i=1;i<=4;i++){
int xx = x+dx[i];//枚举下一个点
int yy = y+dy[i];
if(xx<1||yy<1||xx>n||yy>m||vis[xx][yy]||__gcd(mp[x][y],mp[xx][yy])<=1){
continue;//检验合法性
}
dfs(xx,yy);//走过该点
//cnt++;//cnt放这里,不会统计原点,cnt当初始化为1
}
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];
}
}int x,y;
cin>>x>>y;
memset(vis,false,sizeof(vis));
dfs(x,y);
cout<<cnt<<"\n";
return 0;
}