首先来说,,这题我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. MySQL 聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体的细节依赖于其实现方式,但innoddb 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行. 当表有聚簇索引时,它的数据实际上存 ...

  2. jQuery自学笔记(三):jQuery动画效果

    jQuery隐藏和显示: 使用 hide( ) 和 show( ) 方法来隐藏和显示 HTML 元素: 语法: $(selector).hide(speed,callback); $(selector ...

  3. DESTOON系统文章模块默认设置第一张图片为标题图的方法

    连上FTP或者其他方法打开网站目录下的\module\article\admin\template\edit.tpl.php修改设置内容第 <input name="post[thum ...

  4. iOS:界面适配--iPhone不同机型适配 6/6plus

    iOS:界面适配--iPhone不同机型适配 6/6plus        机型变化 坐标:表示屏幕物理尺寸大小,坐标变大了,表示机器屏幕尺寸变大了: 像素:表示屏幕图片的大小,跟坐标之间有个对应关系 ...

  5. Android系统服务-简介

    http://blog.csdn.net/chenyafei617/article/details/6577907 Introduction 我们知道Android系统服务挺多的,做程序时经常会用到, ...

  6. linux系统时间和硬件时钟问题(date和hwclock)

    http://blog.chinaunix.net/uid-182041-id-3464524.html http://blog.csdn.net/duyiwuer2009/article/detai ...

  7. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...

  8. 用c++编写一个不能被继承的类(但是可以在类外部定义该类的对象)

    据我们知道,我们只要把类的构造函数和析构函数定义为private类型,那么就不能够在外部建立给类的对象,也就不能以给类为基类进行继承,因为如果继承,建立对象的时候将要调用基类的构造函数,但是因为为pr ...

  9. css与 js动画 优缺点比较

    我们经常面临一个抉择:到底使用JavaScript还是CSS动画,下面做一下对比 JS动画 缺点:(1)JavaScript在浏览器的主线程中运行,而主线程中还有其它需要运行的JavaScript脚本 ...

  10. [置顶] Android安全机制分析

    Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...