首页 > 其他分享 >LG8459

LG8459

时间:2024-01-20 17:46:22浏览次数:27  
标签:ch read bmod times le LG8459 式子

这题一看到要判断 \(a \times b = c\) 是否成立,立马想到了用 FFT/NTT。

但看到数据范围 \(a,b \le 10^n\),\(c \le 10^{2n}\),\(n \le 1 \times 10^6 + 50\),再加上时限很紧(\(1\) 秒),因此 \(O(Tn \log n)\) 的 FFT/NTT 会超时。既然暴力求解不行,我们不妨从数学的角度思考这个问题。

还记得关于模运算的性质吗?这题用到了两条重要的性质。

\[(a \times b) \bmod m = (a \bmod m \times b \bmod m) \bmod m \]

这一条的证明方法十分简单,这里不详解。接下来,回忆一下同余,不难想到如下式子(可能见过)。若三个正整数 \(a\),\(b\) 和 \(c\) 满足 \(a \times b = c\),则

\[(a \times b) \bmod m=c \bmod m \]

把第二条式子的左边代换成第一条式子的右边,得到

\[(a \bmod m \times b \bmod m) \bmod m = c \bmod m \]

然后我们只需求出这条式子的两边,判断是否相等即可。模数 \(m\) 随便取(错误率在一定范围内极低,基本上可以忽略,可以用中国剩余定理证明),不要取一些常用的(如 \(998244353\),会被卡掉)。如果显示 WA 则换一个,一般情况下不会出问题。

代码如下:

#include <iostream>
#include <cstdio>
#define MOD 12345
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x*10+ch-48)%MOD;ch=getchar();}//使用快读,边读入边取模,避免了高精度运算
	return x*f;
}
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		long long a,b,c;
		a=read(),b=read(),c=read();
		if(a*b%MOD==c%MOD) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

标签:ch,read,bmod,times,le,LG8459,式子
From: https://www.cnblogs.com/-lilong-/p/17976824

相关文章