B Mask Allocation
题意:
就是将 个口罩分成 份,使得可以从中挑出 组,每组口罩数一样多;也可以从中挑出
AC代码:
const int N = 1e5 + 10;
const ll mod = 1e9 + 7;
int a[N];
int main()
{
int T;
sd(T);
while (T--)
{
int n, m;
sdd(n, m);
int cnt = 0;
while (n != 0 && m != 0)
{
if (n < m)
{
int t = n;
n = m;
m = t;
}
int tmp = m;
while (tmp--)
a[++cnt] = m;
n -= m;
}
pd(cnt);
rep(i, 1, cnt)
printf("%d%c", a[i], i == cnt ? '\n' : ' ');
}
return 0;
}
D Fake News
题意:
打表找规律,只有 和
AC代码:
int main()
{
int t;
sd(t);
while (t--)
{
sld(n);
if (n == 1||n==24)
puts("Fake news!");
else
puts("Nobody knows it better than me!");
}
}
H Dividing(数论分块)
题意:
用题给的三种操作,问
找找规律会发现对于每个 , 的所有点都可以凑到,因为这些点都是可以通过 进行 操作得到,也如此,因为这些点都是可以通过 进行 操作得到。
那么就每次累加 , 统计完去掉 时候重合的,加上除 时候每次漏的
AC代码:
const int N = 2e7 + 50;
const int mod = 1e9 + 7;
ll n, k;
ll ans;
void cal(ll n, ll k)
{
for (ll l = 2, r; l <= k; l = r + 1)
{
r = n / l;
r = min(r, n);
if (r)
r = n / r;
else
r = k;
r = min(r, k);
int len = (r - l + 1) % mod;
int tmp = (n / l) % mod;
ans = (ans + len * 1ll * tmp % mod) % mod;
}
}
int main()
{
sldd(n, k);
ans = (n + k - 1) % mod;
cal(n, k);
n--;
cal(n, k);
pld(ans);
return 0;
}