【CF913G】Power Substring 数论+原根
【CF913G】Power Substring
题意:T组询问,每次给定一个数a,让你求一个k,满足$2^k$的10进制的后$min(100,length(k))$位包含a作为它的子串。你只需要输出一个k,不需要最小化k的值,保证有解。
$T\le 2000,a\le 10^{11}$
题解:神题。
假设a有n位,$2^k=x$,$x=a\times 10^m+b(\mod 10^{n+m})$,我们显然有$k\ge n+m$,所以$2^{n+m}\mid x$,又因为$2^{n+m}\mid 10^{n+m}$,则$2^{n+m}\mid a\times 10^m+b$(等式1)。因为$5^{n+m}\nmid x$,$5^{n+m}\mid 10^{n+m}$,所以$5^{n+m}\nmid a\times 10^m+b$(等式2)。当m确定时,b的取值范围就是一段连续的、长度为$10^m$的区间,所以当$10^m\ge 2^{n+m}$时一定有解,所以m不会太大,我们考虑枚举m。
当m确定时,我们可以根据上面那两条等式快速求出b的值,但如何根据b的值反推得到x的值呢?我们发现等式1的左右两端都能被$2^{n+m}$整除,所以将其除以$2^{n+m}$,得到$y=w (\mod 5^{n+m}),w=\frac {a\times 10^m+b} {2^{n+m}}$。容易证明如下引理:
引理:对于任意$m\le 1$,2是$5^m$的原根。
证明:首先通过枚举可知2是5的原根,$2^i=2,4,3,1,2,....$,循环节为4。
熟悉原根的都知道,a是p的原根当且仅当:将$\varphi(p)$分解质因数变成$\prod p_i^{e_i}$后,对于任意的i,$a^{\frac {\varphi(p)} {p_i}}\neq 1 (\mod p)$。那么当$m\ge 2$时,$\varphi(5^m)$分解质因数形式为$2^2\times 5^{m-1}$,有$2^{4\times 5^{m-2}}=(2^{5^{m-2}})^4=2^4(\mod p^2)$,且$2^{2\times 5^{m-1}}=2^2(\mod p^2)$,二者在$\mod p^a$意义下显然不为1。所以2是$p^m$的原根。
现在我们只需要求出$w$的指标就好了,这里求指标的方法采用了归纳的思想:
1.我们先暴力求出$w$在$\mod 5$意义下的指标$d_1$。
2.我们希望从w在$\mod 5^m$意义下的指标$d_m$推导出w在$\mod 5^{m+1}$意义下的指标$d_{m+1}$,发现对于$j\in\{0,1,2,3,4\}$,存在唯一的j使得$2^{d_m+j}=1(\mod 5^{m+1})$。所以我们暴力枚举j即可。
注意最后这一步采用快速幂会爆long long,所以还要用快速乘。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int T,n,m;
ll x,y,a,b;
inline ll ps(ll x,ll y,ll P)
{
ll z=0;
while(y)
{
if(y&1) z=z+x;
x<<=1,y>>=1;
if(x>=P) x-=P;
if(z>=P) z-=P;
}
return z;
}
inline ll pm(ll x,ll y,ll P)
{
ll z=1;
x%=P;
while(y)
{
if(y&1) z=ps(z,x,P);
x=ps(x,x,P),y>>=1;
}
return z;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld",&a);
ll t=a,m1=1;
n=0;
while(t) t/=10,n++;
for(m=0;;m++,a*=10,m1*=10)
{
b=(-a)&((1<<(n+m))-1);
if((a+b)%5==0) b+=1<<(n+m);
if(b>=m1) continue;
x=a+b,y=x>>(n+m);
int i,j;
ll now=0,phi,pw;
for(i=0;i<4;i++) if(pm(2,i,5)==y%5) now=i;
phi=4,pw=5;
for(i=2;i<=n+m;i++)
{
pw*=5;
for(j=0;j<5;j++) if(pm(2,now+j*phi,pw)==y%pw)
{
now+=j*phi;
break;
}
phi*=5;
}
printf("%lld\n",now+n+m);
break;
}
}
return 0;
}//1 5
【CF913G】Power Substring 数论+原根的更多相关文章
- [数论]原根与指标,BSGS
刚学了这方面的知识,总结一下.推荐学习数论方面的知识还是看书学习,蒟蒻看的是<初等数论>学的. 这里也推荐几个总结性质的博客,学习大佬的代码和习题. 原根:https://blog.csd ...
- 51Nod1039 N^3 Mod P 数论 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...
- 51Nod1038 X^A Mod P 数论 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1038.html 题目传送门 - 51Nod1038 题意 题解 在模质数意义下,求高次剩余,模板题. ...
- POJ 1284 Primitive Roots 数论原根。
Primitive Roots Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2479 Accepted: 1385 D ...
- BZOJ2219数论之神——BSGS+中国剩余定理+原根与指标+欧拉定理+exgcd
题目描述 在ACM_DIY群中,有一位叫做“傻崽”的同学由于在数论方面造诣很高,被称为数轮之神!对于任何数论问题,他都能瞬间秒杀!一天他在群里面问了一个神题: 对于给定的3个非负整数 A,B,K 求出 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho
数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...
- 【数论】【原根】【动态规划】【bitset】2017四川省赛 K.2017 Revenge
题意: 给你n(不超过200w)个数,和一个数r,问你有多少种方案,使得你取出某个子集,能够让它们的乘积 mod 2017等于r. 2017有5这个原根,可以使用离散对数(指标)的思想把乘法转化成加法 ...
- [CodeForces - 1225D]Power Products 【数论】 【分解质因数】
[CodeForces - 1225D]Power Products [数论] [分解质因数] 标签:题解 codeforces题解 数论 题目描述 Time limit 2000 ms Memory ...
随机推荐
- mongodb可视化工具连接报错
failed to get address info 这时候注意看一下 IP地址是不是加了http了,如果加了一定要去掉.IP地址是不加http的.去掉就能正常连接了.
- level1 -- unit 3 - 频率副词
频率副词 never sometimes usually always never 从不 sometimes 有时 usually 通常 always 总是 频率排名(从最不到最经常): never ...
- 1. 自动化运维系列之Cobbler自动装机
preface 我们之前批量安装操作系统的时候都是采用pxe来安装,pxe也是通过网络安装操作系统的,但是PXE依赖于DHCP,HTTP/TFTP,kicstart等支持.安装流程如下所示: 对于上面 ...
- ITIL也玩“太极拳”
近期看到一篇老外写的发布管理的培训材料,其中把发布管理比喻成中国太极图中的“阴”,把变 更管理比喻成“阳”,觉得还挺有意思.之所以这么比喻是因为,他认为“发布”是被动的,接受的,有女性阴柔的一面:而“ ...
- node.js模块依赖及版本号
摘要: Node.js最重要的一个文件就是package.json,其中的配置参数决定了功能.例如下面就是一个例子 { "name": "test", &quo ...
- (翻译)2016美国数学建模MCM F题(政策)翻译:难民移民政策建模
PROBLEM F:Modeling Refugee Immigration Policies With hundreds of thousands of refugees moving across ...
- 如何将数组中的后面m个数移动为前面m个数
思路分析: 可以通过递归的方法实现调整: (1)将前n-m个元素的顺序颠倒. (2)将后面m个元素的顺序颠倒. (3)将n个元素的顺序全部颠倒. 通过以上3个步骤的执行,就可以把数组的元素颠倒. 代码 ...
- SpringMVC由浅入深day01_9商品修改功能开发
9 商品修改功能开发 9.1 需求 操作流程: 1.进入商品查询列表页面 2.点击修改,进入商品修改页面,页面中显示了要修改的商品(从数据库查询) 要修改的商品从数据库查询,根据商品id(主键)查询商 ...
- C++ mysql 乱码
C++读mysql数据库中的中文显示出来的是乱码 在连接到数据库后加上这么一句 mysql_query(pMYSQL, "SET NAMES GB2312"); 或者 mysql_ ...
- 标签a点击以后,5秒内禁止点击,5秒后激活
方法1:利用bootstrap里面的类disabled,禁止链接 <a href='javascript:onHref()' id="test">点击</a> ...