1 条题解

  • 0
    @ 2026-2-28 21:48:02
    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define fu(i,j,k) for(int i=j;i<=k;i++)
    #define fd(i,j,k) for(int i=j;i>=k;i--)
    const int N=10005,P=7340033;
    int qpow(int a,int b){int ans=1;for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P;return ans;}
    int dp[40][N];
    void ntt(int s[],int n,int x)
    {
    	if(n==1)return;
    	int s1[n/2],s2[n/2];
    	fu(i,0,n/2-1)s1[i]=s[i*2],s2[i]=s[i*2+1];
    	ntt(s1,n/2,x*x%P);ntt(s2,n/2,x*x%P);
    	for(int i=0,xi=1;i<n/2;i++,xi=xi*x%P)
    	{
    		s[i]=(s1[i]+s2[i]*xi)%P;
    		s[i+n/2]=((s1[i]-s2[i]*xi)%P+P)%P;
    	} 
    }
    void merge(int s1[],int len1,int s2[],int len2,int s[])
    {
    	int D=1;while(D<len1+len2-1)D<<=1;
    	static int t1[N],t2[N],t3[N];
    	fu(i,0,D-1){
    		t1[i]=(i<len1)?s1[i]:0;
    		t2[i]=(i<len2)?s2[i]:0;
    		t3[i]=0;
    	}
    	int inv=qpow(D,P-2),x=qpow(3,(P-1)/D);
    	ntt(t1,D,x);ntt(t2,D,x);
    	fu(i,0,D-1)t3[i]=t1[i]*t2[i]%P;
    	int inv1=qpow(x,P-2);
    	ntt(t3,D,inv1);
    	fu(i,0,len1+len2-2)s[i]=t3[i]*inv%P;
    	fu(i,len1+len2-1,D-1)s[i]=0;
    }
    int s[N],s1[N],s2[N];
    void init()
    {
    	int len=1;dp[0][0]=dp[1][0]=dp[1][1]=1;
    	for(int i=2;i<=30;i++)
    	{
    		fu(j,0,1000)s[j]=s1[j]=dp[i-1][j];
    		for(int j=1;j<=3;j++)
    		{
    			fu(k,0,1000)s1[k]=dp[i-1][k];
    			merge(s,len*j+1,s1,len+1,s);
    		}
    		fu(j,0,1000)dp[i][j+1]=s[j];dp[i][0]=1;
    		len=min(len*4+1,1000ll);
    	}
    }
    int count(int x)
    {
    	int ans=0;
    	while(x&1&&x!=1)x>>=1,ans++;
    	return ans;
    }
    signed main()
    {
    	init();
    	int q;cin>>q;
    	while(q--)
    	{
    		int n,k;cin>>n>>k;
    		int x=count(n);
    		if(k>1000)cout<<0<<'\n';
    		else cout<<dp[x][k]<<'\n';
    	}
    	return 0;
    }
    • 1

    信息

    ID
    7174
    时间
    4000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    20
    已通过
    5
    上传者