离离原上谱
查看原帖
离离原上谱
1159387
jung_le楼主2025/7/19 15:15

#1#2#3没问题
后面7个点全部输出0
link
求条

#include<bits/stdc++.h>

#define  MOD 10000007
using namespace std;
long long dp[55][55][55],b[55];

long long ksm(long long d,long long m){
	if(m==0)return 1;if(m==1)return d;if(m==2)return (d%MOD*d%MOD);
	if(m%2)return (d%MOD*ksm(d*d,m/2)%MOD)%MOD;
	return ksm((d%MOD*d%MOD)%MOD,m/2)%MOD;
}
long long dfs(int pos,bool is_max,int f,int sum){
	if(pos==0)return f==sum;
	if(!is_max && dp[pos][f][sum]!=-1)return dp[pos][f][sum];
	long long ans=0,end=(is_max? b[pos] :1);
	for(int i=0;i<=end;i++){
		long long t=dfs(pos-1,is_max&&i==end,f+i,sum);
		ans=ans+t;
	}
	if(!is_max)dp[pos][f][sum] = ans;
	return ans;
}
unsigned long long solve(long long x){
	int len=0;
	for(int i=0;i<=54;i++){
		for(int j=0;j<=54;j++){
			for(int k=0;k<=54;k++){
				dp[i][j][k] = -1;
			}
		}
	}
	for(int i=0;i<=54;i++){
		b[i] = 0;
	}
	for(;x>0;x/=2){
		b[++len]=x%2;
	}
	unsigned long long ans=1;
	for(int i=1;i<=len;i++){
//		cout<<dfs(len,1,0,i)<<' '<<i<<'\n';
		ans=(ans%MOD*ksm(i,dfs(len,1,0,i))%MOD)%MOD;
	}
	return ans;
}
long long N;
int main(){
	cin>>N;
	cout<<solve(N); 
	return 0;
}

2025/7/19 15:15
加载中...