[atARC148F]998244353 → 1000000007

科技题

蒙哥马利算法:求$a\cdot m^{-1}\ mod\ M$(其中$m^{-1}$为$m$模$M$的逆元)

记$t=a\cdot \frac{m\cdot m^{-1}-1}{M}\ mod\ m$,则$a+tM\equiv a(1+\frac{m\cdot m^{-1}-1}{M}\cdot M)\equiv 0(mod\ m)$

在此基础上,即有$a\cdot m^{-1}\equiv (a+tM)m^{-1}\equiv \frac{a+tM}{m}(mod\ M)$

 

记$f(a)=\frac{a+tM}{m}$,取$\begin{cases}m=998244353\\M=10^{9}+7\end{cases}$,即可用$6$次操作求出$f(a)$

${\rm rem}\ \ b\ \ a$

${\rm mul}\ \ b\ \ b\ \ \frac{m\cdot m^{-1}-1}{M}$

${\rm rem}\ \ b\ \ b$

${\rm mul}\ \ b\ \ b\ \ M$

${\rm add}\ \ b\ \ a\ \ b$

${\rm mul}\ \ a\ \ b\ \ m模2^{64}的逆元$

同时,有$f(a)\le \lfloor\frac{a+m(M-1)}{m}\rfloor=\lfloor\frac{a}{m}\rfloor+M-1$,则迭代$o(\log_{m}a)$次即可使$a\le M$

 

回到原问题,考虑如下操作——

${\rm mul}\ \ c\ \ a\ \ b$【$1,000,000,012,000,000,036$】

$c=f(c)$【$2,001,758,752$】

${\rm mul}\ \ c\ \ c\ \ (m^{4}\ mod\ M)$【$687,882,754,110,932,128$】

$c=f(c)$【$1,689,092,563$】

$c=f(c)$【$1,000,000,007$】

$c=f(c)$【$1,000,000,007$】

(每行后【】中的数为$c$的上界,估计方式参考前者)

另外,若最终$c=M$,即存在$a$或$b$为$0$,而显然$f(0)=0$,结合过程与此矛盾

共需$4\times 6+2=26$次操作,可以通过

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef unsigned long long ull;
 4 const int m=998244353,M=1000000007,m4=343639189;
 5 const int m0=4924091,k=4915446;
 6 const ull m1=996491785301655553;
 7 void f(){
 8     printf("rem D C\n");
 9     printf("mul D D %d\n",k);
10     printf("rem D D\n");
11     printf("mul D D %d\n",M);
12     printf("add D C D\n");
13     printf("mul C D %llu\n",m1);
14 }
15 int main(){
16     printf("26\n");
17     printf("mul C A B\n");
18     f();
19     printf("mul C C %d\n",m4);
20     f(),f(),f();
21     return 0;
22 }
View Code

 

posted @ 2022-09-21 13:23  PYWBKTDA  阅读(234)  评论(0编辑  收藏  举报