HDU4507 吉哥系列故事——恨7不成妻

原创 2015年07月08日 15:06:55

思路:数位dp,维护三个值,与7无关的数的个数cnt,这cnt个数的和sum,这cnt个数的平方和sqsum

cnt好算,sum则是根据cnt来计算,例如当前状态是这样1234***(确定了前四位,当前确定的是第四位,‘4’),由于递归,在前四位确定的情况下会计算出后三位的共有cnt状态符合使得这个7位数满足“与7无关” 。则算sum时,第4位上的“4"应加cnt次。

sqsum则可以通过展开(a + b)^2= a^2+2*a*b +b^2来利用sum和sqsum计算新的sqsum。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
typedef long long LL;
const LL mod=1e9+7;
int t,bit[22];
LL L,R,fac[22];
struct node
{
    LL cnt,sum,sqsum;
}dp[22][10][10];
node dfs(int len,int sum1,int sum2,bool bound)
{
    node tmp;
    if(len<0)
    {
        if(sum1&&sum2) tmp.cnt=1;
        else tmp.cnt=0;
        tmp.sum=tmp.sqsum=0;
        return tmp;
    }
    if(!bound&&dp[len][sum1][sum2].cnt!=-1) return dp[len][sum1][sum2];
    node ans;
    ans.cnt=ans.sum=ans.sqsum=0;
    int end=bound?bit[len]:9;
    for(int i=0;i<=end;i++)
    {
        if(i==7) continue;
        tmp=dfs(len-1,(sum1+i)%7,(sum2*10+i)%7,bound&&i==end);
        ans.cnt=(ans.cnt+tmp.cnt)%mod;
        ans.sum=(ans.sum+tmp.sum+i*fac[len]%mod*tmp.cnt%mod)%mod;
        ans.sqsum=(ans.sqsum+tmp.sqsum+2*i*fac[len]%mod*tmp.sum%mod+tmp.cnt*i*fac[len]%mod*i%mod*fac[len]%mod)%mod;
    }
    if(!bound) dp[len][sum1][sum2]=ans;
    return ans;
}
LL solve(LL num)
{
    int len=0;
    while(num)
    {
        bit[len++]=num%10;
        num/=10;
    }
    return dfs(len-1,0,0,true).sqsum;
}
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&t);
    fac[0]=1;
    for(int i=1;i<20;i++)
        fac[i]=(fac[i-1]*10)%mod;
    memset(dp,-1,sizeof(dp));
    while(t--)
    {
        scanf("%I64d%I64d",&L,&R);
        printf("%I64d\n",((solve(R)-solve(L-1))+mod)%mod);
    }
    return 0;
}


相关文章推荐

hdu4507吉哥系列故事——恨7不成妻 数位dp

//(a1 + a2 + a3 + a4)^2 + (b1 + b2 + b3 + b4)^2 //=a1^2 + (a2+a3+a4)^2 + 2*a1*(a2+a3+a4) + b1^2 + 2...
  • cq_pf
  • cq_pf
  • 2015年05月04日 16:02
  • 425

[HDU 4507] 吉哥系列故事——恨7不成妻 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4507 话说第一眼看到的时候知道是数位dp,但是确实想不到怎么写,然后看了大牛的博客才写出来的,数学不好真是硬伤...

HDU 4507 吉哥系列故事——恨7不成妻(数位dp,较难)

题目链接HDU 4507 吉哥系列故事——恨7不成妻题意定义和7有关的数字是满足下列条件之一的数字: 整数中某一位是7; 整数的每一位加起来的和是7的整数倍; 这个整数是7的整数倍; 给一个区间[L,...
  • Ramay7
  • Ramay7
  • 2016年09月02日 17:13
  • 171

hdu 4507 吉哥系列故事——恨7不成妻(数位DP,5级)

吉哥系列故事——恨7不成妻 Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T...

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

原题直通车:HDU 4507 吉哥系列故事——恨7不成妻 题意:统计区间中满足下列三个要求的所有数的平方和 1、没有数位是7 2、不是7的倍数 3、各数位和不是7的倍数 代码: #incl...

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

做法: dp[i][j][k] 表示pos位之后 当之前的的 位数和%7 ==j 之前的 十进制数在pos位之前%7 == k 的 数的平方和。 开个结构体 ,表示这个dp 状...

hdu_4507_吉哥系列故事——恨7不成妻(鬼畜数位DP)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题意:中文,不解释,注意的是求的是合法数字的平方和,即(a+b+c+……)^2 题解:数位D...

hdu4507吉哥系列故事——恨7不成妻 (数位dp)

Problem Description   单身!   依然单身!   吉哥依然单身!   DS级码农吉哥依然单身!   所以,他生平最恨情人节,不管是214还是77,他都讨厌!   ...

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

题目链接:Click here~~ 题意: 中文题不解释。 解题思路: 之前做的都是统计满足那些性质的数的 count,这次直接蹦到统计 square sum 了。。。 先考虑如何统计 s...
  • dgq8211
  • dgq8211
  • 2013年12月21日 17:57
  • 2696

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

Description 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关   1、整数中某一位是7;   2、整数的每一位加起来的和是7的整数倍;   3、这个整数是7的整数倍;...
  • V5ZSQ
  • V5ZSQ
  • 2015年07月25日 14:25
  • 319
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU4507 吉哥系列故事——恨7不成妻
举报原因:
原因补充:

(最多只允许输入30个字)