1 条题解
-
0
#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
- 上传者