洛谷P4317 花神的数论题

洛谷题目链接

数位$dp$

我们对$n$进行二进制拆分,于是就阔以像十进制一样数位$dp$了,基本就是套模板。。

接下来是美滋滋的代码时间~~~

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 107
#define ll long long
#define mod 10000007
using namespace std;
ll n;
int val[N];
ll f[N][N];
ll Dfs(int pos,int sum,bool limit)
{
	if(!pos)
		return max(sum,1);
	if(!limit&&f[pos][sum]!=-1)
		return f[pos][sum];
	int maxn=limit?val[pos]:1;
	ll ans=1;
	for(int i=0;i<=maxn;++i)
		ans=(ans*Dfs(pos-1,sum+i,limit&&(i==maxn)))%mod;
	if(!limit)
		f[pos][sum]=ans;
	return ans;
}
ll Get(ll x)
{
	int len=0;
	while(x)
	{
		val[++len]=x&1;
		x/=2;
	}
	memset(f,-1,sizeof(f));
	return Dfs(len,0,1);
}
int main()
{
	scanf("%lld",&n);
	printf("%lld",Get(n));
	return 0;
}

  

posted @ 2019-01-07 21:08  模拟退火  阅读(105)  评论(0编辑  收藏  举报