G - 222
https://atcoder.jp/contests/abc222/tasks/abc222_g
在数列2,22,222,2222,22222,….中
N个X, 首个是 Xi的倍数的下标是?, 或者不存在
范围
N 200
Xi [1,1e8]
我的思路
一眼看上去很数学, 很像Project Euler的题
$2222222 = 2 * 1111111 = 2 * \frac{(10^7 - 1)}{9}$
其实就是问对于x
是否 2 * (10^7 - 1) = 9 k x
首先x的2的幂次为0/1
好像有点绕
$kx = 1111111 = 10^0+10^1+10^2+\cdots$
右边虽然项数为合数时可以拆分, 例如$6 = 3 * 2$, $111111 = 111 \cdot 1001 = 11 \cdot 10101$
但不知道是否能拆出所有
另一个就是对于比较小的11111
的部分,可以pollard-rho
分解
考虑长除法?
每次 除法取mod 乘10 加1
但1e8 不知道效率怎么样
PE 129 做过类似的, 但是问题是首个 让是它倍数的最小$111\cdots 111$长度超过百万的是哪个因子
而有一些可用的结论
除了上面$2,5$因子外$kx = 111\cdots 111$始终有解, 且$111\cdots 111$ 的长度不超过$n$ (因为模数随着长度变化成环)
因此 如果暴力的话, 期望值是在 $O(NAi)$ 的
想了下打表 超过1e6的记录下来, 未超过的现场算, 但很多 超过1e6的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int two(int v){ int c = 0; ll m = 0; do{ m*=10; m+=2; c++; m%=v; }while(m!=0); return c; }
void calc(){ rep(i,1000000, 100000000+1){ if(i % 1000000 == 0) printf("progress %lld\n",i/1000000); if(i % 4 == 0 || i % 5 == 0)continue; int res = two(i); if(res > 1000000) printf("ans[%lld] = %d\n",i,res); } }
|
另一个就是根据PE129的证明过程, 反正有$\phi(n)$ 或者$\phi(9n)$ 是一个解
那么可以找$\phi(n) , \phi(9n)$的因子尝试, 但这样是否能保证是最小的呢????? 根据倍数, 显然最小的是这个解的因子
$\phi(n) = n \cdot (1-1/p1) \cdot (1-1/p2) \cdots$
似乎可做?