萌新求助 TLE
查看原帖
萌新求助 TLE
376997
Harry27182SDream楼主2021/11/12 16:57

rt,感觉时间复杂度是对的,但是 TLE 了5个点,求调

#include<bits/stdc++.h>
#define int long long
#define mod 10000007
using namespace std;
int n,ans=1,len,a[55],f[55][55];
int power(int x,int y,int p)
{
	int ans=1;
	while(y)
	{
		if(y%2)ans=ans*x%p;
		y/=2;
		x=x*x%p;
	}
	return ans%p;
}
int dfs(bool limit,int pos,int sum,int num) 
{
	if(pos==0)return sum==num;
	if(!limit&&f[pos][sum])return f[pos][sum];
	int res=0;
	int up=limit?a[pos]:1;
	for(int i=0;i<=up;i++)res+=dfs(limit&(i==a[pos]),pos-1,sum+(i==1),num);
	if(!limit)f[pos][sum]=res;
	return res;
}
int ask(int k,int num)
{
	len=0;
	while(k)
	{
		a[++len]=k%2;
		k/=2;
	}
	memset(f,0,sizeof(f));
	return dfs(1,len,0,num);
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<=50;i++)ans=ans*power(i,ask(n,i),mod)%mod;
	printf("%lld",ans);
	return 0;
}
2021/11/12 16:57
加载中...