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*b1*(b1+b2+b3)

//每次dfs返回三个数,a,b,c

//a表示个数,b表示所有数的和,c表示所有数的平方和

//那么更新的ans.a += a;

//ans.b +=(b + i*temp_b*a)

//ans.c+=(c + (temp_b*i)^2*a + 2*(temp_b*i)*b)

//其中temp_b为当前数的数量级

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std ;

const int maxn = 20 ;

const int mod_m = 1e9 + 7;

struct node

{

__int64 a , b , c;//a表示个数,b表示所有数的和,c表示所有数的平方和

} dp[maxn][10][10*maxn][2][2];

void equal(node &t1 ,node &t2)

{

t1.a = t2.a;

t1.b = t2.b;

t1.c = t2.c;

}

int bit[maxn] ;

__int64 pow(__int64 a ,__int64 b)

{

__int64 c = 1;

while(b)

{

if(b & 1) c = ((c%mod_m) * (a%mod_m))%mod_m ;

a = ((a%mod_m) * (a%mod_m))%mod_m ;

b >>= 1;

}

return c;

}

node dfs(int pos,int mod ,int sum ,int flag ,int lim )

{

if(dp[pos][mod][sum][flag][lim].a != -1)

return  dp[pos][mod][sum][flag][lim];

int num = lim ? bit[pos] : 9 ;

struct node ans = {0,0,0};

__int64 temp_c = (pow(10,pos-1) * pow(10 , pos-1)) % mod_m ;

__int64 temp_b = pow(10 , pos-1) ;

for(int i = 0;i <= num ;i++)

{

int mod_x = (mod*10 + i) % 7;

int sum_x = sum + i ;

int flag_x = flag;

if(i == 7)

flag_x = 1;

if(pos == 1)

{

if(!flag_x && mod_x!= 0 && (sum_x%7) != 0)

{

ans.a += 1;

ans.b += i;

ans.c += i*i;

}

continue ;

}

struct node now = dfs(pos - 1, mod_x ,sum_x ,flag_x ,lim&&(i == num));

__int64 a = now.a % mod_m;

__int64 b = now.b % mod_m;

__int64 c = now.c % mod_m;

ans.c = (ans.c+c)%mod_m;

ans.c = (ans.c + (((((a*temp_c)%mod_m)*(__int64)i)%mod_m)*i)%mod_m)%mod_m;

ans.c = (ans.c + 2*(((b*temp_b)%mod_m)*(__int64)i)%mod_m)%mod_m;

ans.b = (ans.b + ((__int64)i*((temp_b*a)%mod_m) + b)%mod_m) % mod_m;

ans.a = (ans.a+a)%mod_m;

}

equal(dp[pos][mod][sum][flag][lim] ,ans) ;

return ans;

}

__int64 solve(__int64 n)

{

if(n==0)return 0;

memset(dp , -1 ,sizeof(dp)) ;

int len = 0;

while(n)

{

bit[++len] = n%10;

n/=10;

}

struct node now = dfs(len , 0 ,0 , 0 ,1 ) ;

return now.c ;

}

int main()

{

int T ;__int64 L , R;

scanf("%d" ,&T) ;

while(T--)

{

scanf("%I64d%I64d" ,&L ,&R) ;

printf("%I64d\n" ,(solve(R) - solve(L-1)+mod_m)%mod_m) ;

}

return 0;

}

时间: 2024-07-29 21:15:51

hdu4507吉哥系列故事——恨7不成妻 数位dp的相关文章

hdu-4507 吉哥系列故事——恨7不成妻 数位DP 状态转移分析/极限取模

http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 首先想到数位DP,我们看下如何维护. 最基本的dp需要两维来维护起始数字和长度,此外对于数位求和mod 7的余数需要一维来维护,对于一个数mod 7的余数需要一维维护. 此外我们处理一下平方和,对于一个x开头,长度为len的xoo型数集,把它分成

HDU 4507 吉哥系列故事――恨7不成妻(数位dp&amp;好魔性的一道好题)

题目链接:[kuangbin带你飞]专题十五 数位DP J - 吉哥系列故事――恨7不成妻 题意 Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7*11 最终,他发现原来这一切归根到底都是

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

题目链接: Hdu 4507 吉哥系列故事——恨7不成妻 题目描述: 中文题面不描述. 解题思路: 从数据范围可看出是数位DP.根据题目给的限制,如果是求满足限制的数的数目的话,就很简单了.但是这个题目是让求满足题目中限制的数的平方和.我们可以求出区间中满足题目中限制的数的数目,和这些数的和,然后从这两个东西推出这些数的平方和. 假设现在我们已经递归出后面的x-1位满足题目限制的数的数目(num),和(sum),平方和(ssum),当前x位枚举为i,就可以推出当前节点改变为Num += num,

HDU ACM 4507 吉哥系列故事——恨7不成妻 -&gt;数位DP

题意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关-- 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数倍: 现在问题来了:吉哥想知道在一定区间内和7无关的数字的平方和. 分析:数位DP,关键内容如下. (pre0+i)%7用于处理各个位数之和时候为7的倍数,(pre1*10+i)%7用于处理这个数是否为7的倍数. #include<iostream> using namespace std; const __int64 mod=100

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

题意:中文题. 思路:设dp[pos][i][j]表示当前考虑pos位,之前的数位和对7的余数为i,之前的数值对7的余数为j,与之后的(pos+1)位组合满足条件 的状态(包括之后(pos+1)位满足的个数,后缀和sum,后缀平方和),详见代码: /********************************************************* file name: hdu4507.cpp author : kereo create time: 2015年02月10日 星期二

HDU4507 吉哥系列故事——恨7不成妻 题解 数位DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意: 找到区间 \([L,R]\) 范围内所有满足如下条件的数的 平方和 : 不包含'7': 不能被 7 整除: 各位之和不能被 7 整除. 注意:求的是满足条件的数的 平方和 ! 解题思路: 使用 数位DP 尽情求解. 但是因为这里求的是满足要求的元素的平方和,而不是元素的个数. 所以我们不能简单地开long long来存放结果, 而是开一个结构体来存放结果,结构体中需要包含三个元素:

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

吉哥系列故事――恨7不成妻 Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 单身!  依然单身!  吉哥依然单身!  DS级码农吉哥依然单身!  所以,他生平最恨情人节,不管是214还是77,他都讨厌!    吉哥观察了214和77这两个数,发现:  2+1+4=7  7+7=7*2  77=7*11  最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨

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

Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 77=7*11 最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数! 什么样的数和7有关呢? 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关―― 1.整数中某一位是7: 2.整数的每一位加起来的和是7的整数倍: 3.这个整数是7的整数

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

链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=72 77=711 最终,他发现原来这一切归根到底都是因为和7有关!所以,他现在甚至讨厌一切和7有关的数! 什么样的数和7有关呢? 如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关-- 1.整数中某一位是7: 2.