题目链接: 点击打开链接
A: 有n层楼, 每层有2 * m个窗户, 每家有2个窗户, 任何一个窗户亮说明这家还未休息, 问你有几家没有休息.
模拟题, 每层楼两个两个窗户遍历一次即可.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 205;
int n, m, a[MAXN][MAXN], ans;
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m * 2; ++j)
scanf("%d", &a[i][j]);
for(int i = 0; i < n; ++i)
for(int j = 0; j < m * 2; j += 2)
if(a[i][j] || a[i][j + 1]) ans++;
printf("%d\n", ans);
return 0;
}
B: 给出 n / k个a[i]和n / k个b[i], 问你有多少个k位数, 使得不以b[i]开头切可以整除a[i].
数学题, 容斥定理, 求出所有情况的总数, 减去以b[i]开头的数目就为答案.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
const int MOD = 1e9 + 7;
ll a[MAXN], b[MAXN], num[MAXN], x[MAXN], ans = 1;
int n, k;
int main(int argc, char const *argv[])
{
scanf("%d%d", &n, &k);
for(int i = 1; i <= n / k; ++i)
scanf("%lld", &a[i]);
for(int i = 1; i <= n / k; ++i)
scanf("%lld", &b[i]);
num[0] = 1;
for(int i = 1; i <= k; ++i)
num[i] = num[i - 1] * 10;
for(int i = 1; i <= n / k; ++i) {
ll tmp1 = (num[k] - 1) / a[i] + 1;
ll tmp2 = ((b[i] + 1) * num[k - 1] - 1) / a[i] + 1;
if(b[i] == 0) x[i] = tmp1 - tmp2;
else {
ll tmp3 = (b[i] * num[k - 1] - 1) / a[i] + 1;
x[i] = tmp1 - tmp2 + tmp3;
}
}
for(int i = 1; i <= n / k; ++i)
ans = (ans * x[i]) % MOD;
printf("%lld\n", ans);
return 0;
}