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

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

1

题意

一个正整数和 7 7 7 有关当且仅当满足以下条件之一

  • 数位中某一位是 7 7 7
  • 数位和能被 7 7 7 整除
  • 这个整数能被 7 7 7 整除

统计 [ l , r ] [l,r] [l,r] 内所有和 7 7 7 无关 的数字的 平方和

思路

这道题需要一点思维。我们先来看一个例子:

如果我们现在处理枚举 p o s pos pos 位为 p p p,低 p o s − 1 pos - 1 pos1 位的结果已经处理完了,在当前限制下,低 p o s − 1 pos - 1 pos1 的与 7 7 7 无关的数有: x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3 三个的话,那么它们的平方和应该是: x 1 2 + x 2 2 + x 3 2 x_1 ^ 2 + x_2 ^ 2 + x_3 ^ 2 x12+x22+x32,现在我们要加上 p p p 的贡献,就是将 p p p 拼接上去, p p p 这一位的值是 p ⋅ 1 0 p o s − 1 p \cdot 10^{pos - 1} p10pos1,与 x 1 x_1 x1 拼接成: p x 1 px_1 px1,有: ( p x 1 ) 2 = ( p ⋅ 1 0 p o s − 1 + x 1 ) 2 = ( p ⋅ 1 0 p o s − 1 ) 2 + x 1 2 + 2 ⋅ x 1 ⋅ ( p ⋅ 1 0 p o s − 1 ) (px_1)^2 = (p \cdot 10^{pos-1} + x_1)^2 = (p \cdot 10^{pos-1})^2 + x_1 ^ 2 + 2 \cdot x1 \cdot (p \cdot 10^{pos - 1}) (px1)2=(p10pos1+x1)2=(p10pos1)2+x12+2x1(p10pos1)
其实这里就是一个完全平方公式。

那么我们转移就可以通过维护更低位的平方和 s 2 s_2 s2,符合条件的数有多少个 c n t cnt cnt,符合条件的数的 s 1 s_1 s1,三种信息。

转移就可以写成:
s 2 ′ = s 2 + 2 ⋅ s 1 ⋅ p ⋅ 1 0 p o s − 1 + c n t ⋅ ( p ⋅ 1 0 p o s − 1 ) 2 s_2\prime = s_2 + 2 \cdot s_1 \cdot p \cdot 10 ^{pos - 1} + cnt \cdot (p \cdot 10 ^ {pos -1})^2 s2=s2+2s1p10pos1+cnt(p10pos1)2
s 1 ′ = s 1 + c n t ⋅ p ⋅ 1 0 p o s − 1 s_1\prime = s_1 + cnt \cdot p \cdot 10 ^ {pos - 1} s1=s1+cntp10pos1
c n t ′ = c n t cnt\prime = cnt cnt=cnt

我们可以用 d p [ p o s ] [ r 1 ] [ r 2 ] dp[pos][r_1][r_2] dp[pos][r1][r2] 来表示 p o s pos pos 个全变化位, r 1 r_1 r1 为当前数位和模 7 7 7 的余数, r 2 r_2 r2 为当前数模 7 7 7 的余数条件下的信息。

搜到最底层时所有的位已经确定,所以节点只有一个信息 c n t = 1 cnt = 1 cnt=1 返回。
c n t cnt cnt 初始化为 − 1 -1 1 是为了记忆化,这里的 Z Z Z 类型当成是一个会自动取模的 l o n g l o n g long long longlong 就可以

时间复杂度: O ( l e n × 7 × 7 ) O(len \times 7 \times 7) O(len×7×7)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;const int INF=0x3f3f3f3e;
const long long INFLL=1e18;typedef long long ll;template<class T>
constexpr T power(T a, ll b){T res = 1;while(b){if(b&1) res = res * a;a = a * a;b >>= 1;}return res;
}constexpr ll mul(ll a,ll b,ll mod){ //快速乘,避免两个long long相乘取模溢出ll res = a * b - ll(1.L * a * b / mod) * mod;res %= mod;if(res < 0) res += mod; //误差return res;
}template<ll P>
struct MLL{ll x;constexpr MLL() = default;constexpr MLL(ll x) : x(norm(x % getMod())) {}static ll Mod;constexpr static ll getMod(){if(P > 0) return P;return Mod;}constexpr static void setMod(int _Mod){Mod = _Mod;}constexpr ll norm(ll x) const{if(x < 0){x += getMod();}if(x >= getMod()){x -= getMod();}return x;}constexpr ll val() const{return x;}explicit constexpr operator ll() const{ return x; //将结构体显示转换为ll类型: ll res = static_cast<ll>(OBJ)}constexpr MLL operator -() const{ //负号,等价于加上ModMLL res;res.x = norm(getMod() - x);return res;}constexpr MLL inv() const{assert(x != 0);return power(*this, getMod() - 2); //用费马小定理求逆}constexpr MLL& operator *= (MLL rhs) & { //& 表示“this”指针不能指向一个临时对象或const对象x = mul(x, rhs.x, getMod()); //该函数只能被一个左值调用return *this;}constexpr MLL& operator += (MLL rhs) & {x = norm(x + rhs.x);return *this;}constexpr MLL& operator -= (MLL rhs) & {x = norm(x - rhs.x);return *this;}constexpr MLL& operator /= (MLL rhs) & {return *this *= rhs.inv();}friend constexpr MLL operator * (MLL lhs, MLL rhs){MLL res = lhs;res *= rhs;return res;}friend constexpr MLL operator + (MLL lhs, MLL rhs){MLL res = lhs;res += rhs;return res;}friend constexpr MLL operator - (MLL lhs, MLL rhs){MLL res = lhs;res -= rhs;return res;}friend constexpr MLL operator / (MLL lhs, MLL rhs){MLL res = lhs;res /= rhs;return res;}friend constexpr std::istream& operator >> (std::istream& is, MLL& a){ll v;is >> v;a = MLL(v);return is;}friend constexpr std::ostream& operator << (std::ostream& os, MLL& a){return os << a.val();}friend constexpr bool operator == (MLL lhs, MLL rhs){return lhs.val() == rhs.val();}friend constexpr bool operator != (MLL lhs, MLL rhs){return lhs.val() != rhs.val();}
};const ll mod = 1e9 + 7;
using Z = MLL<mod>;struct node{Z cnt; //限制条件下与7无关的数字数量Z s1; //与7无关的数字的和Z s2; //与7无关的数字平方和node(ll cnt = -1, ll s1 = 0, ll s2 = 0): cnt(cnt), s1(s1), s2(s2) {}//cnt 初始化为 -1 是等价于memset的操作
};node dp[20][8][8];
int num[20];
Z ten[20];node dfs(int pos, int r1, int r2, bool limit){ //r1:当前数位和模7  r2:当前数模7if(!pos) return (r1 && r2 ? node(1) : node(0));if(!limit && dp[pos][r1][r2].cnt != -1) return dp[pos][r1][r2];node res(0);int up = (limit ? num[pos] : 9);fore(i, 0, up + 1){if(i == 7) continue;node nxt = dfs(pos - 1, (r1 + i) % 7, (r2 * 10 + i) % 7, limit && i == up);res.cnt += nxt.cnt;res.s1 += nxt.cnt * i * ten[pos - 1] + nxt.s1;res.s2 += nxt.s2 + nxt.cnt * i * i * ten[pos - 1] * ten[pos - 1];res.s2 += 2 * nxt.s1 * i * ten[pos - 1];}if(!limit) dp[pos][r1][r2] = res;return res;
}Z solve(ll x){int len = 0;while(x){num[++len] = x % 10;x /= 10;}return dfs(len, 0, 0, true).s2;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);ten[0] = 1;fore(i, 1, 19) ten[i] = ten[i - 1] * 10;int t;std::cin >> t;while(t--){ll l, r;std::cin >> l >> r;Z ans = solve(r) - solve(l - 1);std::cout << ans << endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/417743.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeWave学习笔记--采购管理系统

1.CodeWave是什么&#xff1f; CodeWave是一款智能低代码开发平台&#xff0c;基于网易自研拥有大规模参数和深度学习能力的智能模型底座产品架构&#xff0c;为企业级应用提供更加智能化研发的软件生产方式。IT人员可以轻易实现从“智能生成”到“可视化拖拽调整”的全栈低代…

SpringMVC 文件上传和下载

文章目录 1、文件下载2、文件上传3. 应用 Spring MVC 提供了简单而强大的文件上传和下载功能。 下面是对两者的简要介绍&#xff1a; 文件上传&#xff1a; 在Spring MVC中进行文件上传的步骤如下&#xff1a; 在表单中设置 enctype“multipart/form-data”&#xff0c;这样…

Go 日期时间包装器:15条更便捷的时间处理

★ 关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; ” 在Go编程中&#xff0c;处理日期和时间是一项常见任务&#xff0c;涉及到精确性和灵活性。尽管Go的标准库提供了时间包&am…

利用appium自动控制移动设备并提取数据

安装appium-python-client模块并启动已安装好的环境 安装appium-python-client模块 在window的虚拟环境下执行pip install appium-python-client 启动夜神模拟器&#xff0c;进入夜神模拟器所在的安装路径的bin目录下&#xff0c;进入cmd终端&#xff0c;使用adb命令建立adb…

二次开发在线预约上门服务、预约到家系统 增加开发票功能 轮播图链接跳转 uniapp代码

客户具体要求&#xff1a; 1、在我的个人中心里面增加一个 开票功能&#xff0c;点击进去之后可以查看到能开票的订单列表&#xff0c;如果是个人是填写姓名电话邮箱&#xff0c;就是填写单位名称 税号 邮箱&#xff0c;提交申请到后台审核&#xff0c;如果审核通过后线下人工…

循序渐进学 JavaScript <一>

这周复习完了 js 基础&#xff0c;整理一波~ 一、认识 JavaScript 1. 1 编程语言 计算机语言&#xff1a;概念比较广泛&#xff0c;包括 html 标记语言&#xff08;它并不是编程语言&#xff09;编程语言特点 具有数据和数据结构指令和流程控制&#xff1a;switch&#xff0c…

【数据结构】快速排序,归并排序

快速排序 1.hoare版本 根据动图的演示&#xff0c;整理的思路如下&#xff0c; 1.定义left,right,key。key默认是左边第一个元素&#xff0c;像两个指针&#xff0c;左边找比key大的&#xff0c;右边找比k小的&#xff0c;找到的话&#xff0c;交换二者&#xff0c;往返这个过…

14.鸿蒙HarmonyOS App(JAVA)时钟组件计时器倒计时单选按钮复选框开关switch与开关按钮ToggleButton图像组件示范

鸿蒙HarmonyOS App(JAVA) 时钟组件 计时器 倒计时 单选按钮 复选框 开关switch 开关按钮ToggleButton 图像组件 ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:ohos"http://schemas.huawei.co…

设计模式——建造者模式(Builder Pattern)

概述 建造者模式是较为复杂的创建型模式&#xff0c;它将客户端与包含多个组成部分&#xff08;或部件&#xff09;的复杂对象的创建过程分离&#xff0c;客户端无须知道复杂对象的内部组成部分与装配方式&#xff0c;只需要知道所需建造者的类型即可。它关注如何一步一步创建一…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Maven error in opening zip file?maven源码debug定位问题jar包

文章目录 问题发现调试Maven1. 查看maven版本2. 下载对应版本的maven源码3. 打开maven源码&#xff0c;配置启动选项 启动maven debug模式进入maven 源码&#xff0c;打断点调试找jar包算账 已录制视频 视频连接 问题发现 最近使用maven分析jar包的时候遇到了一个很搞的问题。…

【Web】CTFSHOW 文件上传刷题记录(全)

期末考完终于可以好好学ctf了&#xff0c;先把这些该回顾的回顾完&#xff0c;直接rushjava&#xff01; 目录 web151 web152 web153 web154-155 web156-159 web160 web161 web162-163 web164 web165 web166 web167 web168 web169-170 web151 如果直接上传php文…