题目链接: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; }