您的位置:首页 > 其它

hdu 4507 吉哥系列故事——恨7不成妻 数位DP

2013-09-08 11:40 288 查看
数位DP,注意状态DP的转移

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define mod 1000000007
using namespace std;
struct node
{
ll n,sum,pow;
node():n(0),sum(0),pow(0){}
}dp[20][7][7];
int bit[20];
ll p1[20];
node dfs(int pos,int m,int sum,bool f)
{
node p,q;
if(pos==-1){
p.n=m&∑
return p;
}
if(!f&&dp[pos][sum][m].n!=-1) return dp[pos][sum][m];
int e=f?bit[pos]:9;
for(int i=0;i<=e;i++){
if(i==7) continue;
q=dfs(pos-1,(10*m+i)%7,(sum+i)%7,f&&i==bit[pos]);
p.n+=q.n;
p.n%=mod;
p.sum+=p1[pos]*i%mod*q.n+q.sum;
p.sum%=mod;
p.pow+=(p1[pos]*p1[pos]%mod*i%mod*i%mod*q.n+2*p1[pos]*i%mod*q.sum%mod+q.pow);
p.pow%=mod;
}
if(!f) dp[pos][sum][m]=p;
return p;
}
ll cal(ll n)
{
int m=0;
ll s=n;
while(n){
bit[m++]=n%10;
n/=10;
}
return dfs(m-1,0,0,1).pow;
}
int main(){
int t;
ll a,b;
memset(dp,-1,sizeof(dp));
p1[0]=1;
for(int i=1;i<20;i++)
p1[i]=p1[i-1]*10%mod;
scanf("%d",&t);
while(t--){
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",(cal(b)-cal(a-1)+mod)%mod);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: