题干:

单测试点时限: 2.0 秒

内存限制: 1024 MB

“我把房门上锁,并非为了不让她进去,而是为了防止自己逃到她身边”。

她又被数学难住了。QQ 小方当然是不会对女生说”不”的。

她的数学题是这样的,她得到了一个十进制大整数,这个大整数只包含 1 - 9 这 9 个数字。

现在,要求选出其中连续的一段数字,把其他未被选中的数字全部变成 0 ,并且使得变换以后的大整数恰好是 m 的倍数。

QQ 小方为了表现自己的能力,所以一口答应给她写出在所有可能的数里面最小的一个。

但是她的问题太多了,她对于这一个大整数,需要对于 q 个不尽相同的 m 分别给出答案。

但是 QQ 小方自己不会。只能来求助你了,你能帮他解答吗?

输入

第一行包含一个大整数,这个整数的位数为 n (1≤n≤106 )。

第二行一个整数 q (1≤q≤500 ) 代表询问次数。

对于每一个询问,包含一行一个整数,表示第 i 次询问的 mi (1≤mi≤5×107 )。

保证 ∑qi=1mi≤5×107 。

输出

对于每一个询问输出两个整数 l,r 表示保留第 l 到第 r 位。保证一定有解。

样例

Input

1249
4
7
3
2
83

Output

3 4
4 4
3 3
2 4

提示

对于样例:
1249 这个数中,可选出的最小的7 的倍数是49 ,最小的3 的倍数是9 ,2 的倍数是40 ,83 的倍数是249 。

解题报告:

注意到连续区间,考虑两部分作差(两后缀相减)

设 ai 是从第 i 位到末位代表的整数,我们发现答案一定可以表达成 ai−aj (i<j )的形式。

例如,对于 1249 ,1000=1249−249 ,1200=1249−49 ,240 =249−9 。因此,问题可以转化为找到一个最小的 ai−aj ,使得 ai−ajmodm=0 。

要使 ai−ajmodm 为 0 ,只需要 aimodm=ajmodm 。要使 ai−aj 最小,首先需要 ai 最小,其次让 aj 最大。但是容易发现,在 ai 最小的情况下不可能有两个数 aj,ak 同时满足条件,否则 aj,ak 可以组成一个更小的解。因此,我们只要找到两个最小的 ai,aj ,使其对 m 同余即可。注意,aj 是可以等于 0 的。

同时,因为抽屉原理,我们最多只要处理 m+1 个 ai 就能找到答案。

注意别每次都memset,会超时的。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
const int MAXMAX = 5e7 + 5;
char s[MAX];
int n,q,m;
int main()
{scanf("%s",s+1);n=strlen(s+1);cin>>q;while(q--) {scanf("%d",&m);vector<int>vis(m,-1);//memset(vis,-1,sizeof vis);ll now=0,pw=1;vis[0]=n+1;for(int i=n; i; --i) {now=(now+pw*(s[i]-'0'))%m;pw=pw*10%m;if(vis[now]!=-1) {printf("%d %d\n",i,vis[now]-1);break;}vis[now]=i;}}
}

优化2:

#include<cstdio>
#include<bitset>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int maxn=1e6+10,N=5e7+10;
char s[maxn];
int a[maxn];
void up(int i,int j,int& l,int& r) {if(!l)l=i,r=j;
}
bitset<N>mp;
int main() {int q,m,n;scanf("%s",s+1);n=strlen(s+1);scanf("%d",&q);while(q--) {scanf("%d",&m);int y=1,l=0,r=n+1;mp.reset();for(int j,i=n; i; i--) {a[i]=(a[i+1]+y*(s[i]-'0'))%m;y=y*10%m;if(mp[a[i]]) {for(j=i+1; j<=n; j++)if(a[j]==a[i])break;up(i,j-1,l,r);} else if(a[i]%m==0)up(i,n,l,r);mp[a[i]]=1;if(l)break;}printf("%d %d\n",l,r);}
}

优化3:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e6 + 5;
const int MAXMAX = 5e7 + 5;
char s[MAX];
int vis[MAXMAX];
int q,m;
int main()
{scanf("%s",s+1);int len =strlen(s+1);cin>>q;while(q--) {scanf("%d",&m);for(int i = 0; i<=m; i++) vis[i] = -1;ll cur = 0,pw = 1;vis[0] = len+1;for(int i = len; i>=1; i--) {cur = (cur + (s[i]-'0') * pw)%m;pw = (pw*10)%m;if(vis[cur] != -1) {printf("%d %d\n",i,vis[cur]-1);break;}else vis[cur] = i;}}
}

【EOJ Monthly 2019.02 - B】解题(思维,抽屉原理,暴力,模运算,优化,tricks)相关推荐

  1. 【EOJ Monthly 2019.02 - D】进制转换(思维,取模,高精度大数)

    题干: 单测试点时限: 2.0 秒 内存限制: 256 MB "他觉得一个人奋斗更轻松自在.跟没有干劲的人在一起厮混,只会徒增压力." QQ 小方决定一个人研究研究进制转换. 很快 ...

  2. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)

    题干: E. 中位数 单测试点时限: 10.0 秒 内存限制: 256 MB "你的地图是一张白纸,所以即使想决定目的地,也不知道路在哪里." QQ 小方最近在自学图论.他突然想出 ...

  3. 【EOJ Monthly 2019.02 - A】回收卫星(交互题型,二分)

    题干: 单测试点时限: 1.0 秒 内存限制: 256 MB "这个世上没有无用的齿轮,也只有齿轮本身能决定自己的用途." 就像太空中的卫星,虽然不计其数,但都各司其职. 但没有一 ...

  4. 【EOJ Monthly 2019.02 - F】方差(数学,前缀和,积的前缀和)

    题干: 单测试点时限: 2.0 秒 内存限制: 256 MB "放弃不难,但坚持一定很酷." QQ 小方已经在体育馆苦练一天射箭了,但他还在坚持. QQ 小方每天都要在朋友圈晒自己 ...

  5. EOJ Monthly 2019.11 E. 数学题(反演 + 杜教筛 + 拉格朗日插值)

    EOJ Monthly 2019.11 ∑i=1n∑a1=1i∑a2=1i∑a3=1i⋯∑ak−1i∑aki[gcd(a1,a2,a3,-,ak−1,ak,i)==1]=∑i=1n∑d∣iμ(d)⌊i ...

  6. EOJ Monthly 2019.2 (based on February Selection) D 进制转换 【数学 进制转换】

    任意门:https://acm.ecnu.edu.cn/contest/140/problem/D/ D. 进制转换 单测试点时限: 2.0 秒 内存限制: 256 MB "他觉得一个人奋斗 ...

  7. 【EOJ Monthly 2019.01 - E】唐纳德先生与假骰子(假概率问题)

    题干: 单测试点时限: 6.0 秒 内存限制: 1024 MB 嗨,唐纳德先生又来了. 他又带了一枚假骰子,这个骰子的各个面的点数依然是 1,2,3,4,5,6 ,但是六个面向上的概率却不一定都是 1 ...

  8. EOJ Monthly 2019.3 (based on March Selection) -D .宇恒棋

    D.宇恒棋 EOJ传送门 Q小方以前不会下宇恒棋,现在他会了,所以他急切的想教会你. 宇恒棋的规则是这样的:在一个 n×m 的棋盘上,QQ小方和你各有一枚棋子.你们轮流行动,每一次轮到一方的回合时,他 ...

  9. EOJ Monthly 2019.2 (based on February Selection) D.进制转换

    题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...

最新文章

  1. jquery ajax统一对url编码,jQuery AJAX请求中的相对与绝对URL
  2. JustifyTextView 解决TextView中英文混排自动换行的问题
  3. 点击切换div 的隐藏与显示
  4. packet tracer使用心得(二)
  5. [转帖]虚拟内存探究 -- 第二篇:Python 字节
  6. Android 使用线性布局LinearLayout和Button实现一个点红块游戏
  7. radio 取值赋值 亲测有用实效
  8. macOS开启内建的TFTP服务器
  9. 基于设备树的TQ2440 DMA学习(3)—— DMA控制器驱动
  10. 使用MS Test进行单元测试
  11. 学习TP5(一):TP5框架下载与快速入门使用
  12. 爬虫python代码网易云_Python爬虫之网易云音乐下载
  13. 渗透技术——ARP攻击
  14. 发光二极管pcb封装图画法_【AD封装】贴片及插件二极管整流桥(带3D)
  15. 计算机主机报警 声,电脑开机报警声音大全
  16. 计算机标准用户英文名称,标准计算机专业英文简历范文
  17. python交互编程模式_进入python交互模式的方法
  18. 使用ImageJ测图片中物体的平均灰度值
  19. 【Linux系统开发】x210开发板根目录文件系统构建
  20. Sonya and Matrix Beauty

热门文章

  1. asp.net 之高速缓存
  2. 算法十——深度优先搜索和广度优先搜索
  3. [Leedcode][JAVA][第11题][盛最多水的容器][双指针][贪心]
  4. disperse函数 C语言,武汉工业学院电气1006班C语言测试题.doc
  5. 计算机中函数counta表示,excel中counta函数的使用方法
  6. android 自定义spnner弹出框,PopupWindow,ListView实现自定义Spinner
  7. java random算法_负载均衡--随机算法(Random)
  8. 白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试
  9. html的div显示到最左侧,HTML/CSS:如何淡化div的左右边缘?
  10. cmd cd 无法切换目录_一分钟掌握cmd基础操作,告别鼠标