60分数位求助大佬
查看原帖
60分数位求助大佬
584977
Susking楼主2022/7/4 19:05

错了后面四个quq(没错套模板也会错的蒟蒻是我)

#include<bits/stdc++.h>
#define ll long long
#define M 10000007
using namespace std;
ll N,dig[60],dp[60][150], ans=1;
ll dfs(int pos,int tot1,int tot0,bool qd0,bool limit){
//	cout<<"pos:"<<pos<<" tot0:"<<tot0<<" tot1:"<<tot1<<" qd0:"<<qd0<<" limit:"<<limit<<endl;
	if(!pos){
		return max(tot1,1)%M;
	}
	if(!qd0 &&!limit &&dp[pos][tot1]){
		return dp[pos][tot1];
	}
	int sum=1,up=limit?dig[pos]:1;
	for(int i=0;i<=up;i++){
		sum=sum*dfs(pos-1,i?tot1+1:tot1,tot0,qd0 &&!i,limit &&i==up)%M;
	}
//	cout<<"sum:"<<sum<<endl;
	if(!qd0 &&!limit) dp[pos][tot1]=sum;
	return sum;
}
ll solve(int n){
	int i=0;
	memset(dig,0,sizeof(dig));
	memset(dp,0,sizeof(dp));
	while(n){
		dig[++i]=n%2;
		n/=2;
	}
	return dfs(i,0,0,true,true);
}
int main(){
	scanf("%lld",&N);
	printf("%lld",solve(N));
}
2022/7/4 19:05
加载中...