题意:

  如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关:
  1、整数中某一位是7;
  2、整数的每一位加起来的和是7的整数倍;
  3、这个整数是7的整数倍;

  给定一个区间[L,R],问在此区间内和7无关的所有数字的平方和。

思路:

  第一步好解决,只是数位DP的基础。第二步是十进制的所有位加起来是7的整数倍,这个只是需要用多一维来记录%7的结果就行了。第三步是7的整数倍问题,假设c=a+b,那么c%7=(a%7+b)%7,就假设这个数是10086,那么(10000%7+86)%7就行了,一样可以通过增加一维来解决。最后还要解决平方和问题,如第三步,(a+b)2=a2+2ab+b2,而∑(b2)部分已经在前面完成了,我们需要将其记录起来。剩下a2+2ab需要解决,∑(a2)直接算,∑(2ab)=2a*∑(b),所以∑(b)也是需要记录的,而求和∑就需要知道前面到底有几个数是合法的才行,则需要记录个数cnt。所以一共需要用到3维的数组,其中需要记录合法个数cnt,数的和sum,数的平方和ssum。

 #include <bits/stdc++.h>
#define pii pair<int,int>
#define INF 0x7f3f3f3f
#define LL long long
#define ULL unsigned long long
using namespace std;
const double PI = acos(-1.0);
const int N=;
const LL mod=1e9+; struct node
{
/*
1.与7无关的数的个数
2.与7无关的数的和
3.与7无关的数的平方和。
*/
ULL cnt;
ULL sum;
ULL ssum;
}dp[N][][]; void pre_cal()
{
ULL base=dp[][][].cnt=;
for(int i=; i<N; i++,base*= ) //位数
{
for(int u=; u<; u++) //第i位为u
{
if(u==) continue; //不合法
ULL c=u*base%mod; for(int j=; j<; j++) //位和
for(int k=; k<; k++) //数和
{
ULL a=(u+j)%, b=(u*base+k)%;
ULL sum =dp[i-][j][k].sum,ssum=dp[i-][j][k].ssum,cnt =dp[i-][j][k].cnt;; dp[i][a][b].cnt +=cnt; //个数
dp[i][a][b].cnt %=mod;
dp[i][a][b].sum +=sum +c*cnt%mod; //和
dp[i][a][b].sum %=mod;
dp[i][a][b].ssum+=ssum + *c*sum%mod + cnt*c%mod*c%mod;//平方和:3部分
dp[i][a][b].ssum%=mod;
}
}
}
} int bit[N+];
ULL cal(ULL n)
{
memset(bit, , sizeof(bit));
ULL base=, ans=, len=, i, pre=, bsum=; //bsum记录前缀的位和
while(n)
{
bit[++len]=n%;
n/=;
base*=;
}
for( i=len; i>; i--)
{
base/=;
for(int u=; u<bit[i]; u++) //当前位
{
if(u==) continue;
ULL c=(pre*+u)*base%mod; //前缀,注意c已经取模了
for(int a=; a<; a++) //位和
for(int b=; b<; b++) //数和
if( (bsum+u+a)% && ( (pre*%+u)*base+b)% )
{
ULL cnt=dp[i-][a][b].cnt;
ULL sum=dp[i-][a][b].sum;
ULL ssum=dp[i-][a][b].ssum; ans+= ssum + *c*sum%mod + cnt*c%mod*c%mod ;
ans%=mod;
}
}
pre=pre*+bit[i];
bsum+=bit[i]; //前缀的位和
if(bit[i]==) break; //前缀出现了7,后面不可能了
}
return ans%mod;
} int main()
{
//freopen("input.txt","r",stdin);
pre_cal();
LL L, R;
int t;cin>>t;
while(t--)
{
scanf("%lld %lld",&L,&R);
printf("%llu\n", (cal(R+)-cal(L)+mod)%mod );
}
return ;
}

AC代码

HDU 4507 吉哥系列故事——恨7不成妻 (数位DP)的更多相关文章

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

    吉哥系列故事——恨7不成妻 http://acm.hdu.edu.cn/showproblem.php?pid=4507 Time Limit: 1000/500 MS (Java/Others)   ...

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

    链接: https://vjudge.net/problem/HDU-4507 题意: 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都 ...

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

    Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 求[L,R]中不满足任意条件的数的平方和mod 1e9+7. 条件: 1.整数中某一位是7:2.整数的每一 ...

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

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:如果一个整数符合下面3个条件之一,那么我们就说这个整数和7有关 1.整数中某一位是7: ...

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

    需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...

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

    题意:给定区间[L, R]求区间内与7无关数的平方和.一个数当满足三个规则之一则认为与7有关:1.整数中某一位是7:2.整数的每一位加起来的和是7的整数倍:3.这个整数是7的整数倍: 分析:初看起来确 ...

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

    题目描述 求 $[L,R]$ 内满足:数位中不包含7.数位之和不是7的倍数.本身不是7的倍数 的所有数的平方和 mod $10^9+7$ . 输入 输入数据的第一行是case数T(1 <= T ...

  9. hdu4507 吉哥系列故事——恨7不成妻[数位DP]

    这题面什么垃圾玩意儿 首先看到问题格式想到数位DP,但是求的是平方和.尝试用数位DP推出. 先尝试拼出和.设$f[len][sum][mod]$表示填到$len$位,已填位置数位和$sum$,数字取余 ...

随机推荐

  1. 9. 那些强悍的PHP一句话后门

    强悍的PHP一句话后门 这类后门让网站.服务器管理员很是头疼,经常要换着方法进行各种检测,而很多新出现的编写技术,用普通的检测方法是没法发现并处理的.今天我们细数一些有意思的PHP一句话木马. 利用4 ...

  2. C#中异步及winform中界面假死

    c#中可以用BeginInvoke去启动异步调用,但是有两个BeginInvoke一个是controller的BeginInvoke还有一个是委托的BeginInvoke. 主要区别是controll ...

  3. cogs 1901. [国家集训队2011]数颜色

    Cogs 1901. [国家集训队2011]数颜色 ★★★   输入文件:nt2011_color.in   输出文件:nt2011_color.out   简单对比时间限制:0.6 s   内存限制 ...

  4. 剑指Offer的学习笔记(C#篇)-- 对称的二叉树

    题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 一 . 题目分析 递归法. 一.空树判断,单独搞出来. 二.非空树. 递归:一 ...

  5. Linux常用命令(补充)-grep

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  6. Windows服务器初始配置

    系统状态是否良好 检查ip地址.子网掩码等配置 防火墙是否关闭 是否有攻击,有多大的攻击,什么类型的攻击,攻击流量图 是否中病毒 1.改端口 (1)打开注册表 [HKEY_LOCAL_MACHINE\ ...

  7. A Simple Math Problem (矩阵快速幂)

    Lele now is thinking about a simple function f(x).  If x < 10 f(x) = x.  If x >= 10 f(x) = a0 ...

  8. 2017"百度之星"程序设计大赛 - 初赛(B)小小粉丝度度熊

    Problem Description 度度熊喜欢着喵哈哈村的大明星——星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要 ...

  9. GPU程序缓存(GPU Program Caching)

    GPU程序缓存 翻译文章: GPU Program Caching 总览 / 为什么 因为有一个沙盒, 每一次加载页面, 我们都会转化, 编译和链接它的GPU着色器. 当然不是每一个页面都需要着色器, ...

  10. 优化MyEclipse编译速度慢的问题

    转载大神的 https://www.cnblogs.com/luxd/p/5999217.html