社区讨论

对于题解第一篇的95pts优化

P2822[NOIP 2016 提高组] 组合数问题参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhphxrzo
此快照首次捕获于
2025/11/08 07:38
4 个月前
此快照最后确认于
2025/11/09 02:29
4 个月前
查看原帖
前面还是一样的,我们在统计答案时使用前缀和来优化计算这样我们就可以很快的用O(tn)O(tn)的复杂度来解决这一道题,但是由于当年的测评机性能并不好可能在题解作者的那个年代这个做法并不对,附出ACcode:
CPP
#include <bits/stdc++.h>
#define pb push_back
#define pf(a) push_front(a)
#define pof pop_front
#define pob pop_back
#define fr() front()
#define ba() back()
#define ls(x) x << 1
#define rs(x) (x << 1) | 1
#define re register
#define in(a) insert(a)
#define fi first
#define se second
#define gcd(a, b) __gcd(a, b)
#define l2(a) log(a) / log(2)
#define ui128 unsigned __int128
#define ll long long
#define pll pair<ll, ll>
#define ull unsigned long long
#define pii pair<int, int>
#define pq1 priority_queue<int>
#define pq2 priority_queue<int, vector<int>, greater<int>>
#define ui unsigned int
#define db long double
#define IOS ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
using namespace std;
const int N = 2005;
ull a[N][N];
int n,m,t;
ull c[N][N];
ull k;
int s[N][N];
int sum[N][N];
void init(){
    c[1][1] = 1;
    c[1][0] = c[0][0] = 1;
    for(int i = 2;i <= N - 5;++i){
        c[i][0] = 1;
        for(int j = 1;j <= i;++j){
            c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % k;
            if(c[i][j] % k == 0)s[i][j] = 1;
        }
    }
}
signed main() {
    // freopen("work.in", "r", stdin);
    // freopen("work.out", "w", stdout);
    IOS;
    cin>>t>>k;
    init();
    for(int i = 1;i <= N - 5;++i){
        for(int j = 1;j <= i;++j){
            sum[i][j] = sum[i][j - 1] + s[i][j];
        }
    }
    while(t--){
        cin>>n>>m;
        ll ans = 0;
        for(int i = 0;i <= n;++i){
            ans += sum[i][min(i,m)];
        }
        cout<<ans<<'\n';
    }
}

回复

0 条回复,欢迎继续交流。

正在加载回复...