zoukankan      html  css  js  c++  java
  • CodeForces 258B Little Elephant and Elections

    标签(空格分隔): 数位DP 背包DP


    算出有i个幸运数字的方案,然后枚举上限做背包DP

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll read()
    {
    	ll x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int mod=1e9+7;
    int m,f[15][15],g[15],dit[15];
    ll calc(int x)
    {
    	ll res=1;
    	for(int i=0;i<6;i++)res=res*(x-i)%mod;
    	return res;
    }
    void MOD(int &x,int y)
    {
    	x+=y;
    	if(x>=mod)x-=mod;
    }
    int dp(int step,int r,int lim)
    {
    	if(step==0)return r==0;
    	if(!lim&&~f[step][r])return f[step][r];
    	int x=lim?dit[step]:9,res=0;
    	for(int i=0;i<=x;i++)
    	{
    		if(i==4||i==7)
    		{
    			if(r==0)continue;
    			MOD(res,dp(step-1,r-1,lim&&i==x));
    			continue;
    		}
    		res+=dp(step-1,r,lim&&i==x);
    	}
    	if(!lim)f[step][r]=res;
    	return res;
    }
    int dfs(int step,int r,ll mul)
    {
    	if(step==0)return mul;
    	int res=0;
    	for(int i=0;i<=r;i++)if(g[i])
    	{
    		g[i]--;
    		MOD(res,dfs(step-1,r-i,mul*(g[i]+1)%mod));
    		g[i]++;
    	}
    	return res;
    }
    int main()
    {
    	memset(f,-1,sizeof(f));
    	m=read();
    	int len=0;
    	while(m)dit[++len]=m%10,m/=10;
    	for(int i=0;i<=len;i++)g[i]=dp(len,i,1);
    	g[0]--;
    	int ans=0;
    	for(int i=1;i<=len;i++)MOD(ans,(ll)g[i]*dfs(6,i-1,1)%mod);
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    HashMap和Hashtable的区别
    java倒计时三种简单实现方式
    AngularJS---基本操作
    AngularJS---认识AngularJS
    Java线程面试题
    JAVA中高访问量高并发的问题怎么解决?
    Java高并发,如何解决,什么方式解决
    Map总结
    Github
    反射
  • 原文地址:https://www.cnblogs.com/ljzalc1022/p/9018902.html
Copyright © 2011-2022 走看看