結果

問題 No.2206 Popcount Sum 2
ユーザー maksimmaksim
提出日時 2023-02-09 18:19:21
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 660 ms / 4,000 ms
コード長 2,167 bytes
コンパイル時間 2,619 ms
コンパイル使用メモリ 175,084 KB
実行使用メモリ 36,328 KB
最終ジャッジ日時 2023-09-21 01:27:33
合計ジャッジ時間 15,798 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 155 ms
20,540 KB
testcase_01 AC 154 ms
20,528 KB
testcase_02 AC 447 ms
24,252 KB
testcase_03 AC 446 ms
24,332 KB
testcase_04 AC 447 ms
24,208 KB
testcase_05 AC 652 ms
34,628 KB
testcase_06 AC 656 ms
34,636 KB
testcase_07 AC 660 ms
33,404 KB
testcase_08 AC 658 ms
33,460 KB
testcase_09 AC 654 ms
34,888 KB
testcase_10 AC 647 ms
36,268 KB
testcase_11 AC 648 ms
36,328 KB
testcase_12 AC 647 ms
35,264 KB
testcase_13 AC 628 ms
35,060 KB
testcase_14 AC 617 ms
34,872 KB
testcase_15 AC 614 ms
35,128 KB
testcase_16 AC 617 ms
34,968 KB
testcase_17 AC 646 ms
34,840 KB
testcase_18 AC 615 ms
34,920 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;
#define int long long
#ifdef LOCAL
#define __int128 long long
#endif // LOCAL
const int p=998244353;
int po(int a,int b) {if(b==0) return 1; if(b==1) return a; if(b%2==0) {int u=po(a,b/2);return (u*u)%p;} else {int u=po(a,b-1);return (a*u)%p;}}
int inv(int x) {return po(x,p-2);}
const int maxn=4e5+5;
const int sq=600;
int c1[sq+1][sq+1];int pr1[sq+1][sq+1];
int fact[maxn];int invf[maxn];int po2[maxn];
int h[maxn];int pr[maxn];
int c(int n,int k)
{
    if(k<0 || n<k || n<0) return 0;
    int ans=fact[n];ans*=invf[k];ans%=p;ans*=invf[n-k];ans%=p;return ans;
}
int32_t main()
{
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    fact[0]=1;for(int i=1;i<maxn;++i) {fact[i]=(fact[i-1]*i)%p;}
    for(int i=0;i<maxn;++i) invf[i]=inv(fact[i]);
    po2[0]=1;for(int i=1;i<maxn;++i) {po2[i]=(po2[i-1]*2)%p;}
    for(int i=0;i<sq;++i) for(int j=0;j<sq;++j) c1[i][j]=c(i,j);
    for(int i=0;i<=sq;++i) for(int j=0;j<sq;++j) {pr1[i][j+1]=pr1[i][j]+c1[i][j];if(pr1[i][j+1]>=p) pr1[i][j+1]-=p;}
    int t;cin>>t;
    vector<array<int,3> > v1,v;
    int res[t]={0};
    for(int cyc=0;cyc<t;++cyc) {int n,m;cin>>n>>m;v1.push_back({n,m,cyc});}
    v=v1;sort(v.begin(),v.end());
    int cur=0;h[0]=1;pr[1]=1;
    for(int i=0;i<t;++i)
    {
        int n=v[i][0];int m=v[i][1];int id=v[i][2];
        --n;
        while(cur+sq<=n)
        {
            cur+=sq;
            for(int i=0;i<=cur;++i)
            {
                h[i]=c(cur,i);
            }
            pr[0]=0;for(int i=0;i<=cur;++i) {pr[i+1]=pr[i]+h[i];if(pr[i+1]>=p) pr[i+1]-=p;}
        }
        int di=n-cur;
        int bo=max(0LL,m-di);
        __int128 ans=pr[bo]*po2[di];
        for(int i=bo;i<m;++i)
        {
            ans+=h[i]*pr1[di][m-i];
            #ifdef LOCAL
            ans%=p;
            #endif // LOCAL
        }
        res[id]=(ans%p);
    }
    for(int i=0;i<t;++i)
    {
        int n=v1[i][0];int m=v1[i][1];
        cout<<(res[i]*(po2[n]-1))%p<<'\n';
        /*int ans=0;
        for(int i=0;i<m;++i)
        {
            ans+=c(n-1,i);ans%=p;
        }
        cout<<(ans*(po2[n]-1))%p<<endl;*/
    }
    return 0;
}
0