首先来说,,这题我wrong了好几次,代码力太弱啊。。很多细节没考虑。。

题意:给定两个数 L R,1 <= L <= R <= 10^18 ;求L 到 R 间 与 7 无关的数的平方和

什么数与7 无关?

1 没有数字7

2 不是7的倍数

3 所有数字的和不是7的倍数

我们先来考虑一下  如果这题问的是: L 到 R 间 与7 无关的数有多少个?

这道题该怎么思考? 给一点提示  dp 方程可以写成三维的 num(i,j,k) 其中 i 代表数的位数 j 代表 这个数对7取模的余数 k 代表这个数所有数字和对7取模的值,至于num(i,j,k) 当让就是这种数的个数了, 方程的转化也很简单  从数末尾逐步填数字 l (0~9)的话 num(i+1,(j*10+l)%7,(k+l)%7)+=num(i,j,k);

接下来 我默认你知道 num[i][j][k] 该怎么求了 这个时候 再来考虑一下 L 到 R 间与7 无关的数的和 ? 这个时候不用考虑的太复杂,,因为首先,你在求num[i][j][k]的时候已经求出了所有的满足条件的数的所有可能,要求和,无非就是哪一位的那个数字有多少个。

如果我们的dp是逐步往数的末尾填数 ,这个时候可以这样写 sum(i,j,k)其中i,j,k和num的i,j,k一个意思,然后sum表示满足这种情况的数的和 方程的转换可以写为:同样从数末尾逐步填数字 l (0~9)-- num(i+1,(j*10+l)%7,(k+l)%7)+=sum(i,j,k)*10+num(i,j,k)*l;

再来考虑平方和就比较容易了,,我们知道如果前面的数是a 我们往后面塞一个数字l 那么我们要求的数的平方和是---(10*a+l)^2 也就是100*a*a+20*a*l+l*l

方程我就不写了,,然后接下来的思路都是和上面的类似

贴出渣渣的代码。。。

 #include<iostream>
#include<stdio.h>
#include<string.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<stdlib.h>
#include <vector>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define ll __int64
#define CL(a,b) memset(a,b,sizeof(a))
#define MAXNODE 100010
ll MOD=; ll s,e; ll dp[][][];
ll wsu[][][];
ll num[][][];
ll val[];
void initval()
{
int i=;
val[]=;
val[]=;
for(i=;i<=;i++)
{
val[i]=val[i-]*;
}
} void initdp()
{
int i,j,k,l;
CL(dp,);
CL(num,);
CL(wsu,);
for(i=;i<;i++)
{
if(i==)continue;
dp[][i%][i%]+=i*i;
wsu[][i%][i%]+=i;
num[][i%][i%]++;
}
num[][][]=;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
for(k=;k<;k++)
{
for(l=;l<;l++)
{
if(l==)continue;
num[i+][(j+l)%][(k*+l)%]+=num[i][j][k]%MOD;
num[i+][(j+l)%][(k*+l)%]%=MOD;
wsu[i+][(j+l)%][(k*+l)%]+=(wsu[i][j][k]*(ll)+(ll)l*(num[i][j][k]))%MOD;
wsu[i+][(j+l)%][(k*+l)%]%=MOD;
dp[i+][(j+l)%][(k*+l)%]+=(((ll)l*(ll)l*num[i][j][k])+dp[i][j][k]*+(ll)*(ll)l*wsu[i][j][k]*(ll))%MOD;
dp[i+][(j+l)%][(k*+l)%]%=MOD;
}
// printf("%d %d %d %I64d\n",i,j,k,dp[i][j][k]);
}
}
}
} ll pro(ll n)
{
if(n==)return ;
ll rem=;
ll nu[];
int w,i,j,k;
nu[]=;
ll tem=n,va;w=,rem=;
while(tem!=)
{
nu[w]=tem%;
tem/=;
w++;
}
va=;
int su=;
ll v=;
while(--w)
{
if(nu[w]==)
{
for(i=;i<w;i++)nu[i]=;
nu[w]=;
}
for(i=nu[w]-;i>=;i--)
{
if(i==)continue;
for(j=;j<;j++)
{
for(k=;k<;k++)
{
if((su+i+j)%==)continue;
if(((ll)v+(ll)i*val[w]+(ll)k)%==)continue;
ll pre=(va+(ll)i*(val[w]%MOD))%MOD;
pre%=MOD;
rem+=(((pre*pre)%MOD)*(num[w-][j][k]%MOD))%MOD;
rem%=MOD;
rem+=dp[w-][j][k]%MOD;;
rem%=MOD;
rem+=((((ll)*pre)%MOD)*wsu[w-][j][k]%MOD)%MOD;
rem%=MOD;
}
}
}
rem%=MOD;
va+=(nu[w]*(val[w]%MOD))%MOD;
va%=MOD;
v+=nu[w]*(val[w]%);
v%=;
su+=nu[w];
su%=;
}
if(v!=&&su!=)rem+=(va*va)%MOD;
return rem%MOD;
} int main()
{
int tt;
initval();
initdp();
scanf("%d",&tt);
while(tt--)
{
scanf("%I64d %I64d",&s,&e);
ll rs=pro(s-1LL);
ll re=pro(e);
ll rem=re-rs;
rem=rem%MOD;
if(rem<)rem+=MOD;
// printf("%I64d %I64d ",rs,re);
printf("%I64d\n",rem);
}
return ;
}

HDU 4507 有点复杂却不难的数位DP的更多相关文章

  1. 【HDU 5456】 Matches Puzzle Game (数位DP)

    Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...

  2. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. HDU - 4389 X mod f(x)(数位dp)

    http://acm.hdu.edu.cn/showproblem.php?pid=4389 题意 为[A,B] 区间内的数能刚好被其位数和整除的数有多少个. 分析 典型的数位dp...比赛时想不出状 ...

  4. 【HDU】4352 XHXJ's LIS(数位dp+状压)

    题目 传送门:QWQ 分析 数位dp 状压一下现在的$ O(nlogn) $的$ LIS $的二分数组 数据小,所以更新时直接暴力不用二分了. 代码 #include <bits/stdc++. ...

  5. HDU 4389——X mod f(x)(数位DP)

    X mod f(x) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Probl ...

  6. hdu 3709 Balanced Number(平衡数)--数位dp

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  7. hdu 2089 记忆化搜索写法(数位dp)

    /* 记忆化搜索,第二维判断是否是6 */ #include<stdio.h> #include<string.h> #define N 9 int dp[N][2],digi ...

  8. hdu:2089 ( 数位dp入门+模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...

  9. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

随机推荐

  1. js中的逻辑或和逻辑与

    a=''||'abc';                              //返回什么?  'abc' a=1||2;                                  // ...

  2. 未能在全局命名空间中找到类型或命名空间名称“Wuqi”

    下载了AspNetPager控件用以进行分页操作,在项目中放入控件后,运行报错:未能在全局命名空间中找到类型或命名空间名称“Wuqi” . 解决办法:在项目下拉框“引用“中添加AspNetPager引 ...

  3. C语言(按键获取与函数)

    举一个简单的例子,如果有按键,就输出相关按键.否则,输出“.”.每隔 100 毫秒输出一次.按 ESC 退出.注:ESC 的 ASCII 码是 27. #include <stdio.h> ...

  4. linux下如何编译python生成libpython2.5.so动态库

    http://biancheng.dnbcw.info/python/245306.html

  5. C语言在单片机开发中的应用

    在单片机的开发应用中,已逐渐开始引入高级语言,C语言就是其中的一种.对用惯了汇编的人来说,总觉得高级语言’可控性’不好,不如汇编那样随心所欲.但是只要我们掌握了一定的C语言知识,有些东西还是容易做出来 ...

  6. Spring注解 @Resource和@Autowired

    @Resource和@Autowired两者都是做bean的注入使用.其实@Resource并不是Spring的注解,他的包是javax.annotation.Resource 需要导入.但是Spri ...

  7. 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

    类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...

  8. 传智播客8月C/C++基础班开班

     秋天已经向我们走来,在这个充满收获的季节里,大家齐聚传智C/C++学院这个大家庭,无论你曾经从事什么工作,都拥有着一颗热爱C/C++的心,为了自己心中的梦想,大家要付出百倍的努力,要做到&quo ...

  9. 【转】关于Adapter的The content of the adapter has changed问题分析 关于Adapter的The content of the adapter has changed问题分析

    原文网址:http://www.cnblogs.com/monodin/p/3874147.html 1.问题描述 1 07-28 17:22:02.162: E/AndroidRuntime(167 ...

  10. JVM基础和调优(二)

    主要讲述java虚拟机的内存体系结构 了解了JVM 的一些基础之后,我们来看看java虚拟机内存的体系结构,这个是理解JVM垃圾收集算法的前提,理解了内存结构我们才能够针对不同的部分根据我们的程序进行 ...