C - Takahashi Gets Lost
分析:数据小,暴力没什么好说的
int h,w,n;
string t;
char c[505][505];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int get(char c){if(c=='L')return 3;if(c=='U')return 1;if(c=='R')return 2;return 0;
}
int check(int x,int y,int id){if(c[x][y]!='.')return 0;if(id==n)return 1;int opt=get(t[id]);int nx=x+dx[opt];int ny=y+dy[opt];if(c[nx][ny]!='.')return 0;return check(nx,ny,id+1);
}
signed main(){cin>>h>>w>>n;cin>>t;for(int i=1;i<=h;i++){for(int j=1;j<=w;j++){cin>>c[i][j];}}int ans=0;for(int i=1;i<=h;i++){for(int j=1;j<=w;j++){ans+=check(i,j,0);}}cout<<ans;return 0;
}
D - Only one of two
知识点:最小公倍数,二分,容斥原理
分析:符合要求的数字不能同时是n和m的倍数。所以我们求出n和m的最小公倍数lc,但凡是lc的倍数,就不符合要求。
然后二分查找第k个数的值。
设x为答案
那么
ps:一个容易忽略的点,0是任何数的倍数
int n, m, k,lc;
int a[N];
bool check(int x) {if (x / n + x / m - (x / lc)*2 >= k) return 1;else return 0;
}
void solve() {//能被n或m其中一个整除cin >> n >> m >> k;lc = lcm(n, m);int l = 1, r = 1e19;int ans = 1;while (l <= r) {int mid = (l + r) >> 1;if (check(mid)) {r = mid - 1;ans = mid;}else {l = mid + 1;}}cout << ans << endl;
}