HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507

题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关

    1、整数中某一位是7;
    2、整数的每一位加起来的和是7的整数倍;
    3、这个整数是7的整数倍;
    求一定区间内和7无关的数字的平方和。

解题思路:这里我们用一个结构体分别存储符合条件的数的个数n,从当前位开始至末尾的数值s(比如一个数当前为1234***,*表示还不知道的位值,代表的就是***),从当前位开始至末尾的数的平方和sq(比如一个数当前为1234***,代表的就是(***)x(***))。我们用结构体dp[pos][mod1][mod2]来记录状态。因为可以保证如果当前位置!满足limit并且mod1和mod2都相等,那么最后的得到的sq都是相同的。

我们可以利用下一位的n,s,sq,退出上一位n,s,sq,其间存在递推关系。比如234(n=1,s,sq)怎么推到6234?那就是s2=s+6*10^3,sq=2*(6*10^3)*234+(6*10^3)*(6*10^3);

代码:

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 typedef unsigned long long ll;
 6 const ll MOD=1e9+7;
 7 int a[25];
 8 ll power[25];
 9 struct node{
10     ll n,s,sq;//符合条件的数的个数,各位值之和,平方和
11 }dp[25][10][10];
12
13 node dfs(ll pos,ll mod1,ll mod2,bool limit){//每次的value不一样,不能直接存平方和的值之和
14     if(pos==0){
15         node t;
16         t.n=(mod1&&mod2);
17         t.s=t.sq=0;
18         return t;
19     }
20     if(!limit&&dp[pos][mod1][mod2].n!=-1) return dp[pos][mod1][mod2];
21     node ans,temp;
22     ans.n=ans.s=ans.sq=0;
23     int up=limit?a[pos]:9;
24     for(int i=0;i<=up;i++){
25         if(i==7)    continue;
26         temp = dfs(pos-1,(mod1*10+i)%7,(mod2+i)%7,limit && (i == up));
27           ans.n=(ans.n + temp.n)%MOD;
28          ans.s=(ans.s+temp.s+((i*power[pos])%MOD *temp.n) % MOD) % MOD;
29           ans.sq=(ans.sq+temp.sq+((2*i*power[pos])%MOD*temp.s)%MOD)%MOD;
30         ans.sq=(ans.sq+(((i*i*power[pos])%MOD*power[pos])%MOD*temp.n)%MOD)%MOD;
31     }
32     if(!limit)    dp[pos][mod1][mod2]=ans;
33     return ans;
34 }
35
36 ll solve(ll n){
37     ll top=0;
38     while(n){
39         a[++top]=n%10;
40         n/=10;
41     }
42     node ans=dfs(top,0,0,true);
43     return ans.sq;
44 }
45
46 int main(){
47     memset(dp,-1,sizeof(dp));
48     power[1]=1;
49     for(int i=2;i<=19;i++){
50         power[i]=(power[i-1]*10)%MOD;
51     }
52     int t;
53     scanf("%d",&t);
54     while(t--){
55         ll l,r,ans;
56         scanf("%lld %lld",&l,&r);
57         ans=(solve(r)-solve(l-1)+MOD)%MOD;//可能出现负数,所以要补回来
58         printf("%lld\n",ans);
59     }
60     return 0;
61 }
时间: 2024-10-25 05:57:02

HDU 4507 吉哥系列故事――恨7不成妻(数位DP+结构体)的相关文章

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

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

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

题意:中文题. 思路:设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日 星期二

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)

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不成妻

吉哥系列故事――恨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,数学)

链接: 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.

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不成妻

需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define mod 1000000007LL using namespace std; long long bit[30],tab[50],ret=0,t,l,r; struct pnt { long long val1,val2,val3; pnt (long