题目链接:https://codeforces.com/contest/1798/problem/C

数论方面的题,大意是给出n个商品的数量和价格,求存在多少段l-r之间连续包装的价格组合?

需要明白的一点0和其他数的公约数等于其他数。

很明显我们需要求出任意连续ai*bi的最大公约数,用这个数来看是否存在模除bi的最小公倍数等于0

题不难,但是脑子没转过来。比赛前期一直在往扩欧和同余方面考虑,后来发现了做法却没能实现,主要问题在于对bi的最小公倍的处理,我的做法一直是想着用上一个ai*bi的最大公约和当前的bi比较,没有考虑到bi的最小公倍。

code:

const int nn = 2e6+10;
ll __lcm(ll a,ll b){
	return a*b/__gcd(a,b);
}
void solve()
{
	int n;
	cin>>n;
	vector<ll> a(n+1),b(n+1);
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
	}
	ll ans = 1;
	ll g = 0,m = 1;
	for(int i=1;i<=n;i++){
		if(__gcd(g,a[i]*b[i])%__lcm(m,b[i])!=0){
			ans++;
			g = 0;
			m = 1;
		}
		g = __gcd(g,a[i]*b[i]);
		m = __lcm(m,b[i]);
	}
	cout<<ans<<endl;
}