题解:P14992 取模
zhenjianuo2025 · · 题解
如果只用普通的加减乘除运算,似乎很难在不比较一个数和
有个公式是
其中
我们在
根据这个公式只需要算三项:
接下来考虑倍增,设
语句条数约为
#include<bits/stdc++.h>
bool Mbg;
using namespace std;
#define int long long
void exgcd(int a,int b,int &x,int &y){
if(!b){
x=1;y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
int n,M1,M2,C;
int iv;
void work(){
cin>>n>>M1>>M2>>C;
int a=((__int128)1<<64)%M1,x,y;
exgcd(a,M1,x,y);
iv=(x%M1+M1)%M1;
if(C<M2){
printf("v[0]=v[0]+0;\n");
return;
}
int N=__lg(C/M2);
for(int i=N;i>=0;i--){
int B=M2<<i;
printf("v[1]=%lld-v[0];\n",B-1); //a-b
printf("v[1]=v[1]%%%d;\n",M1);
printf("v[1]=v[1]+v[0];\n");
printf("v[1]=v[1]+%d;\n",(-(B-1)%M1+M1)%M1);
printf("v[1]=v[1]%%%d;\n",M1);
printf("v[1]=v[1]*%d;\n",iv);
printf("v[1]=v[1]%%%d;\n",M1);
printf("v[1]=v[1]*%lld;\n",B);
printf("v[0]=v[0]-v[1];\n");
}
}
bool Med;
signed main(){
int T=1;while(T--)work();
// cerr<<"Time: "<<clock()<<" ms;\n";
// cerr<<"Memory: "<<abs(&Med-&Mbg)/1024.0/1024.0<<" MiB.\n";
}