CF1866B Battling with Numbers
思路
首先对于 \(p\) 和 \(q\),他们都必须是 \(Y\) 的倍数,不然 \(\gcd\) 就不是 \(Y\) 了。
再算出来 \(\frac X Y\) 的值,当然如果 \(X\) 不是 \(Y\) 的倍数,那肯定无解。
因为此题特殊的输入方式,所以我们可以很轻易的得到 \(\frac X Y\) 的质因子和个数。
那么对于 \(\frac X Y\) 中的一种质因子,要么全给 \(p\),要么全给 \(q\),如果 \(p\) 给一些,\(q\) 给一些,\(\gcd\) 就会比 \(X\) 大,所以一个质因子有两种选择,假设 \(\frac X Y\) 有 \(k\) 个不同的质因子,那么答案就是 \(2^k\)。记得答案要取模哦。
AC code
#include<bits/stdc++.h>
using namespace std;
const long long mod=998244353;
long long n,m,a[100005],b,ans=1;
map<long long,long long>p1,p2;
inline long long qsm(long long a,long long b)
{
long long ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
a=a*a%mod,b>>=1;
}
return ans;
}
int main()
{
scanf("%lld",&n);
for(long long i=1;i<=n;++i) scanf("%lld",&a[i]);
for(long long i=1;i<=n;++i) scanf("%lld",&b),p1[a[i]]=b;
scanf("%lld",&m);
for(long long i=1;i<=m;++i) scanf("%lld",&a[i]);
for(long long i=1;i<=m;++i) scanf("%lld",&b),p2[a[i]]=b;
for(auto i:p2)
{
if(p1[i.first]<i.second) printf("0"),exit(0);
if(p1[i.first]-i.second) ans=ans*2%mod;
p1[i.first]=0;
}
for(auto i:p1)
{
if(i.second) ans=ans*2%mod;
}
printf("%lld",ans);
return 0;
}