CF1866B Battling with Numbers

去洛谷看我的博客

思路

首先对于 p p p q q q,他们都必须是 Y Y Y 的倍数,不然 gcd ⁡ \gcd gcd 就不是 Y Y Y 了。

再算出来 X Y \frac X Y YX 的值,当然如果 X X X 不是 Y Y Y 的倍数,那肯定无解。

因为此题特殊的输入方式,所以我们可以很轻易的得到 X Y \frac X Y YX 的质因子和个数。

那么对于 X Y \frac X Y YX 中的一种质因子,要么全给 p p p,要么全给 q q q,如果 p p p 给一些, q q q 给一些, gcd ⁡ \gcd gcd 就会比 X X X 大,所以一个质因子有两种选择,假设 X Y \frac X Y YX k k k 个不同的质因子,那么答案就是 2 k 2^k 2k。记得答案要取模哦。

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;
}
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值