P3868 [TJOI2009] 猜数字

\(b_i|(n-a_i)\)。
可转化为 \(n\equiv a_i\pmod{b_i}\)。
然后CRT。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,x=0;
const int maxn=15;
int a[maxn],b[maxn],m[maxn],t[maxn],M=1;
void exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1,y=0;return ;
	}
	exgcd(b,a%b,y,x);y-=a/b*x;
}
int ny(int a,int mod){
	int x,y;
	exgcd(a,mod,x,y);
	return (x%mod+mod)%mod;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	for(int i=1;i<=n;i++)cin>>a[i],M*=a[i];
	for(int i=1;i<=n;i++)m[i]=M/a[i],t[i]=ny(m[i],a[i]);
	for(int i=1;i<=n;i++)x+=((__int128)b[i]*m[i]%M*t[i]%M),x%=M;
	cout<<x;
	return 0;
}
上一篇:看FFA原作者的代码学到的


下一篇:Vue强制刷新子组件