传送门

文章目录

  • 题意:
  • 思路:

题意:

定义f(x)f(x)f(x)表示xxx的十进制下数位和,现在给你aaa,让你选一个区间[l,r][l,r][l,r],满足∑i=lrf(i)moda=0\sum_{i=l}^rf(i)\bmod a=0∑i=lr​f(i)moda=0。

1≤a≤1e181\le a\le1e181≤a≤1e18

要求输出的l,rl,rl,r满足1≤l≤r≤102001\le l\le r\le 10^{200}1≤l≤r≤10200

思路:

考虑这样一个事情,对于xxx,我们找一个10k>x10^k>x10k>x,那么此时f(10k+x)−f(x)=1f(10^k+x)-f(x)=1f(10k+x)−f(x)=1。

有了这个之后,我们自然的想构造出来aaa个这样的对,这样模aaa就是000了。

取一个比aaa大的101010的幂次101910^{19}1019,所以就会想到构造这样的区间[a+1,1019+a][a+1,10^{19}+a][a+1,1019+a],转换成前缀和的形式[1,1019+a]−[1,a][1,10^{19}+a]-[1,a][1,1019+a]−[1,a],显然这是不行的,虽然这样保证了[1,a],[1019+1,1019+a][1,a],[10^{19}+1,10^{19}+a][1,a],[1019+1,1019+a]两个区间对应数fff做差为111,并且有aaa个这样的数,但是忽略了[a+1,1019][a+1,10^{19}][a+1,1019]这段区间对答案的贡献,那么既然去不掉这段区间,那么不妨将这段区间加入答案中,也就是我们上面说的aaa对这样的数,假设多出来kkk,那么我们只需要添加a−ka-ka−k对即可,考虑这些多出来的怎么计算。

我们考虑求出来∑i=11019f(i)moda\sum_{i=1}^{10^{19}}f(i)\bmod a∑i=11019​f(i)moda,设其为kkk,换句话说,我们现在需要加上a−ka-ka−k个111就可以达到要求了。考虑将原本区间[1,1019][1,10^{19}][1,1019]不断右移,比如右移一次[2,1019+1][2,10^{19}+1][2,1019+1],不难发现,这个时候原本的111的贡献变成了1+10191+10^{19}1+1019的贡献,增加了111,所以我们右移a−ka-ka−k次,得到区间[a−k+1,1019+a−k][a-k+1,10^{19}+a-k][a−k+1,1019+a−k],答案就是这个区间啦。

取一个比较大的101010的幂次,防止移动过程中超过这个幂次即可。

// Problem: C. Hack it!
// Contest: Codeforces - Codeforces Round #268 (Div. 1)
// URL: https://codeforces.com/problemset/problem/468/C
// Memory Limit: 256 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<random>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,INF=0x3f3f3f3f;
const double eps=1e-6;LL f[30][10*20],mod;
int a[30];LL dp(int pos,LL sum,int flag) {if(pos==0) return sum%mod;if(f[pos][sum]!=-1&&flag) return f[pos][sum];int x=flag? 9:a[pos];LL ans=0;for(int i=0;i<=x;i++) (ans+=dp(pos-1,sum+i,flag||i<x))%=mod;if(flag) f[pos][sum]=ans;return ans;
}LL solve() {// int tot=0;// while(x) a[++tot]=x%10,x/=10;// return dp(tot,0,0);for(int i=1;i<=19;i++) a[i]=0;a[20]=1;return dp(20,0,0);
}inline __int128 read()
{__int128 x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}inline void write(__int128 x)
{if(x<0){putchar('-');x=-x;}if(x>9)write(x/10);putchar(x%10+'0');
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);memset(f,-1,sizeof(f));scanf("%lld",&mod);LL k=solve()%mod;write((__int128)mod-k+1); putchar(' ');write((__int128)100000000000000000*100+mod-k);puts("");return 0;
}
/**/

Codeforces Round #268 (Div. 1) C. Hack it! 数位dp + 构造数位相关推荐

  1. Codeforces Round #743 (Div. 2) D. Xor of 3 模拟 + 构造

    传送门 文章目录 题意: 思路: 题意: 给你一个010101序列aaa,定义一次操作是选择一个[1,n−2][1,n-2][1,n−2]范围内的下表,将ai,ai+1,ai+2a_i,a_{i+1} ...

  2. Codeforces Round #585 (Div. 2) E. Marbles 状压dp + 逆序对

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑数列最终的状态一定是相同颜色在一起,所以我们发现他的颜色是有顺序的!显然可以用状压dpdpdp来枚举颜色的顺序,但是又有问题了,你怎么确定当前这个 ...

  3. Codeforces Round #741 (Div. 2) E. Rescue Niwen! 字符串 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个串sss,定义其扩张串为s1,s1s2,...,s1s2..sn,s2,s2s3,...,sns_1,s_1s_2,...,s_1s_2..s_n,s ...

  4. Codeforces Round #740 (Div. 2) D2. Up the Strip dp + 分块优化 + 逆向思维

    传送门 文章目录 题意: 思路 题意: 有nnn个细胞,你初始在第nnn细胞上,假设你当前在xxx处,你每次可以进行如下两个操作: (1)(1)(1)选择[1,x−1][1,x-1][1,x−1]内一 ...

  5. Codeforces Round #727 (Div. 2) E. Game with Cards dp + 思维

    传送门 文章目录 题意: 思路: 题意: 初始有左右手,上面各有一个数字为000的卡牌,每次都有一个新卡kik_iki​,你可以将其放在左手或者右手,使两只手上的卡片范围在[ll,i,rl,i][l_ ...

  6. Codeforces Round #462 (Div. 2) C. A Twisty Movement dp + 思维转换

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的只包含1,21,21,2的序列aaa,你可以至多翻转一段区间,求翻转之后最长非递减子序列是多长. 思路: 考虑如果翻转的话,翻转的子区间 ...

  7. Codeforces Round #630 (Div. 2) F. Independent Set 树形dp

    传送门 文章目录 题意: 思路: 题意: 给你一棵树,求这棵树的边导出子图中独立集的数量和,独立集大小可以为000. 思路: 先考虑普通的独立集数量怎么求,无非就是分情况讨论一下选根还是不选根,而这个 ...

  8. Codeforces Round #265 (Div. 1) C. Substitutes in Number dp

    题目链接: http://codeforces.com/contest/464/problem/C J. Substitutes in Number time limit per test 1 sec ...

  9. Codeforces Round #355 (Div. 2) D. Vanya and Treasure dp+分块

    题目链接: http://codeforces.com/contest/677/problem/D 题意: 让你求最短的从start->...->1->...->2->. ...

最新文章

  1. Linux--------------安装jdk
  2. JS数组reduce()方法
  3. (3)verilog语言编写二分频
  4. 50 岁程序员创业说:两个月提交 50 个 PR,三个月内融资 2000 万美元
  5. 阿里云成立技术脱贫联盟,要用技术助力脱贫
  6. 【精品】Android游戏类源码大集合
  7. 2020第十一届蓝桥杯省赛python真题详解
  8. C++:wchar_t 和C++新增类型:char16_t char32_t
  9. API接口怎么使用(教你使用api接口获取数据)
  10. TUP首期主题论坛报道:中小型开发商移动开发的生存之道
  11. 微信小程序上传图片后 开发者工具自动刷新问题
  12. 上交大计算机科学与技术,上海交通大学计算机科学与工程系(CSE)
  13. 75岁母亲被6个子女遗弃身亡,“凶手”一句话惹怒全网:当你老了,真相比想象中更残忍
  14. avoid mutating a prop directly since the value will be overwritten whenever完美解决
  15. 2019-2020 ICPC Asia Hong Kong Regional Contest
  16. 计算机组用户名跟密码忘了,访问局域网工作组的电脑需要用户名和密码怎么办...
  17. 黑苹果MacOSX 10.9.3 Mavericks(13D65) 安装教程
  18. C语言实现移位密码体制
  19. 最大似然估计与最大后验概率的区别与联系
  20. 【读书笔记】《成为-米歇尔.奥巴马自传》读后感

热门文章

  1. java把对象转成json_java 把对象 对象转换成json字符串 | 学步园
  2. linux ini文件,Shell script - Linux下解析ini配置文件
  3. 增强型的for循环linkedlist_LinkedList的复习
  4. 为什么睡觉时身体突然抖一下?答案吓到我了!
  5. 图像还可以这样玩!如何用OpenCV处理图像?
  6. 天赋差的程序员,难道就只能半途而废吗?
  7. 学会了Python之后,我的职业生涯突飞猛进
  8. 数据挖掘的十种分析方法
  9. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程
  10. cass小插件集合_插件|如何精准提取CASS方格网高程点?