4 条题解

  • 0
    @ 2024-10-2 22:25:31
    #include<bits/stdc++.h>
    #define int unsigned long long
    using namespace std;
    namespace IO{
        char buff[1<<21],*p1=buff,*p2=buff;
        char getch(){
            return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;
        }
        template<typename T>
        void read(T &x){
            char ch=getch();int fl=1;x=0;
            while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}
            while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}
            x*=fl;
        }
        template<typename T,typename ...Args>
        void read(T &x,Args& ...args){
            read(x);read(args...);
        }
        char obuf[1<<21],*p3=obuf;
        void putch(char ch){
            if(p3-obuf<(1<<21))*p3++=ch;
            else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;
        }
        char ch[100];
        template<typename T>
        void write(T x){
            if(!x)return putch('0');
            if(x<0)putch('-'),x*=-1;
            int top=0;
            while(x)ch[++top]=x%10+48,x/=10;
            while(top)putch(ch[top]),top--;
        }
        template<typename T,typename ...Args>
        void write(T x,Args ...args){
            write(x);write(args...);
        }
        void flush(){fwrite(obuf,p3-obuf,1,stdout);}
    }
    using namespace IO;
    const int MAXN=64,mod=(1ull<<63);
    inline int poww(int x,int y){
    	int sum=1;
    	while(y){
    		if(y&1)sum*=x;
    		x=x*x;
    		y>>=1;
    	}
    	return sum;
    }
    int P[MAXN];
    map<int,map<int,int>>f,C;
    inline int solve(int n,int m){
    	if(n==1)return (m==0?1:0);
    	if(f[m][n])return f[m][n];
    	if(n&1)return f[m][n]=solve(n-1,m)+poww(n-1,m);
    	int sum=(m<MAXN?P[m]*solve(n/2,m):0);
    	for(int i=0;i<=m&&i<MAXN;i++)sum+=P[i]*C[m][i]*solve(n/2,i);
    	return f[m][n]=sum;
    }
    signed main(){
    	P[0]=1,C[0][0]=1;
    	int n,m;
    	read(m,n);
    	for(int i=1;i<MAXN;i++)P[i]=P[i-1]+P[i-1];
    	for(int i=1;i<MAXN;i++)
    		for(int j=C[i][0]=1;j<=i;j++)
    			C[i][j]=C[i-1][j]+C[i-1][j-1];
    	for(int i=0;i<=m&&i<MAXN;i++){
    		C[m][i]=1;
    		int sum=0;
    		for(int j=1;j<=i;j++){
    			int x=m-j+1;
    			while(!(x&1))sum++,x>>=1;
    			C[m][i]*=x;
    		}
    		for(int j=1;j<=i;j++){
    			int x=j;
    			while(!(x&1))sum--,x>>=1;
    			C[m][i]*=poww(x,mod-1);
    		}
    		if(sum<MAXN)C[m][i]*=P[sum];
    		else C[m][i]=0;
    	}
    	write(solve(n,m));
    	flush();
    	return 0;
    }
    

    信息

    ID
    3214
    时间
    200ms
    内存
    256MiB
    难度
    9
    标签
    (无)
    递交数
    15
    已通过
    2
    上传者