4 条题解

  • 0
    @ 2024-10-3 9:22:48
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cmath>
    #define N 66
    #define ull unsigned long long
    using namespace std;
    
    ull s2[N][N];
    
    void init(int n){
    	s2[0][0] = 1;
    	for(int i=1;i<=n;++i)
    	for(int j=1;j<=i;++j)
    		s2[i][j] = j*s2[i-1][j] + s2[i-1][j-1];
    }
    
    inline ull coef(ull n,int j){
    	ull res = 1;
    	for(int i=0;i<j;++i){
    		if((n-i)%j) res *= n-i;
    		else res *= (n-i)/j;
    	}
    	return res;
    }
    
    inline ull solve(ull n,int k){ // \sum_{i=0}^{n-1} i^k
    	ull res = 0;
    	for(int j=0;j<=k;++j)
    		res += s2[k][j]*coef(n,j+1);
    	return res;
    }
    
    inline void multiply(const ull *f,const ull *g,int n,ull *r){
    	static ull h[N];
    	for(int i=0;i<=n;++i) h[i] = 0;
    	for(int i=0;i<=n;++i)
    	for(int j=0;j<=i;++j)
    		h[i] += f[j]*g[i-j];
    	for(int i=0;i<=n;++i) r[i] = h[i];
    }
    
    inline void power(ull *f,int n,int k,ull *r){
    	static ull g[N];
    	g[0] = 1;
    	for(int i=1;i<=n;++i) g[i] = 0;
    	while(k){
    		if(k&1) multiply(g,f,n,g);
    		multiply(f,f,n,f);
    		k >>= 1;
    	}
    	for(int i=0;i<=n;++i) r[i] = g[i];
    }
    
    int k;
    ull n,ans;
    ull f[N];
    
    int main(){
    	init(64);
    	scanf("%d%llu",&k,&n);
    	if(k<64) ans = solve(n,k);
    	else{
    		f[0] = f[1] = 1;
    		power(f,63,k,f);
    		n >>= 1;
    		for(int j=0;j<=63;++j)
    			ans += (f[j]<<j)*solve(n,j);
    	}
    	printf("%llu",ans);
        return 0;   
    }
    

    信息

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