洛谷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; }