0
点赞
收藏
分享

微信扫一扫

吉哥系列故事——恨7不成妻 HDU - 4507

​​http://acm.hdu.edu.cn/showproblem.php?pid=4507​​

额外记录一下权值和以及平方权值和即可

已知x sum(vi) sum(vi*vi) 来求sum((vi+x)*(vi+x)) 这样可以算出每一位对整个答案的贡献

sum((vi+x)*(vi+x))=sum(vi*vi+2*vi*x+x*x)=sum(vi*vi)+2*x*sum(vi)+n*x*x

 

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int maxn=20;
const int maxm=10;

struct node
{
ll cnt,sum1,sum2;
};

node dp[maxn][maxm][maxm];
ll pre[maxn];
int bit[maxn];

void init()
{
int i;
memset(dp,-1,sizeof(dp));
pre[0]=1;
for(i=1;i<=19;i++){
pre[i]=(10ll*pre[i-1])%mod;
}
}

node dfs(int pos,ll sta1,ll sta2,int limit)
{
node res,tmp;
ll det,up,i;
if(pos==-1){
res.cnt=(sta1!=0&&sta2!=0),res.sum1=0,res.sum2=0;
return res;
}
if(!limit&&dp[pos][sta1][sta2].cnt!=-1) return dp[pos][sta1][sta2];
if(limit) up=bit[pos];
else up=9;
res.cnt=0,res.sum1=0,res.sum2=0;
for(i=0;i<=up;i++){
if(i==7) continue;
tmp=dfs(pos-1,(10ll*sta1+i)%7,(sta2+i)%7,limit&&i==bit[pos]);

res.cnt+=tmp.cnt;
res.cnt%=mod;
res.sum1+=(tmp.sum1+((pre[pos]*i)%mod)*tmp.cnt%mod)%mod;
res.sum1%=mod;
res.sum2+=(tmp.sum2+((2*pre[pos]*i)%mod)*tmp.sum1)%mod;
res.sum2%=mod;
res.sum2+=((tmp.cnt*pre[pos])%mod*pre[pos]%mod*i*i%mod);
res.sum2%=mod;
}
if(!limit) dp[pos][sta1][sta2]=res;
return res;
}

ll solve(ll val)
{
int n;
n=0;
while(val>0){
bit[n++]=val%10;
val/=10;
}
return dfs(n-1,0,0,1).sum2;
}

int main()
{
ll l,r;
int t;
init();
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&l,&r);
printf("%lld\n",(solve(r)-solve(l-1)+mod)%mod);
}
return 0;
}

/*
1
10 11
*/

 


举报

相关推荐

0 条评论