今天依然是数学基础,数学真的是博大精深,昨天是关于进制的,今天就是一些基本知识了,感觉还是挺难的,代码不长但是就是想不到,主要体现在思维难度:P2822,P2789,P3913。
首先是P2822这个得用到杨辉三角,取模,前缀和,给我干麻了,不过也是收获最大的,发现
这个可以和杨辉三角结合,同时复习了前缀和,这里推荐一篇文章:
https://blog.csdn.net/weixin_45629285/article/details/111146240
这个大佬的前缀和和差分写的很好。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
int t, k, n, m;
int c[2005][2005], ans[2005][2005];
void prepare()
{
c[1][1] = 1;
for (int i = 0; i <= 2000; i++)
{
c[i][0] = 1;
}
for (int i = 2; i <= 2000; i++)
{
for (int j = 1; j <= i; j++)
{
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])%k;
}
}
for (int i = 2; i <= 2000; i++)
{
for (int j = 1; j <= i; j++)
{
ans[i][j] = ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1];
if (!c[i][j])
ans[i][j] += 1;
}
ans[i][i + 1] = ans[i][i];
}
}
int main()
{
cin >> t >> k;
prepare();
while (t--)
{
cin >> n >> m;
if (n < m)
m = n;
cout << ans[n][m] << endl;
}
return 0;
}
然后就是P2789,这个也是我没想到的,我看答案都看了半天,直接深搜就可以了:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int f[30];
int n;
int ans = 0;
void suv(int p, int m)
{
if (p == 0)
{
if (!f[m])
ans++;
f[m] = 1;
}
else
for (int r = p; r >= 1; r--)
suv(p - r, r * (p - r) + m);
}
int main()
{
cin >> n;
suv(n, 0);
cout << ans;
return 0;
}
最后就是P3919,这个就是去重:
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
long long N, K;
long long x[1000004], y[1000005];
int main()
{
cin >> N >> K;
for (int i = 0; i < K; i++)
{
cin >> x[i] >> y[i];
}
sort(x, x + K);
sort(y, y + K);
long long t1 = 0;
long long t2 = 0;
for (int i = 0; i < K; i++)
{
if (x[i] != x[i + 1])
t1++;
if (y[i] != y[i + 1])
t2++;
}
long long ans = N * N - (N - t1) * (N - t2);
cout << ans << endl;
return 0;
}