C. Candy Store(数学)

Problem - C - Codeforces

C. Candy Store(数学)_第1张图片

C. Candy Store(数学)_第2张图片 

给定我们n种糖果,已知每种糖果的总的数量ai和 单价bi,让我们每种糖果打包,每种糖果每包的价格为ci ,每包的数量为di ,ci = bi * di,ai是di的倍数,问我们通过合理的安排,最少有几种ci

ai能够整除di,ai * bi 能够整除 bi * di ,也就是说 ai * bi 能够整除ci

在一段ci相同的区间中,ci是bi的公倍数,ai * bi 是ci 的公倍数

gcd : 最大公约数,lcm:最小公倍数

也就是  gcd(ai*bi , a(i+1) * b (i+1), ....)    能够整除 lcm(b[i],b[i+1] ,...) ,整除完就是这一段的ci

随着区间的增大,gcd递减,lcm递增,gcd/lcm 递减

LCM[0,a]=0,GCD[0,a]=|a|,LCM[a,a]=|a|,GCD[a,a]=|a|

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define int long long 
#include 
#define x first
#define y second
#define pb emplace_back
#define fu(i,a,b) for(int i=a;i<=b; ++ i)
#define fd(i,a,b) for(int i=a;i>=b;	-- i)
#define endl '\n'
#define ms(x,y) memset(x,y,sizeof x)
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector> VVL;
typedef vector> VVI;
typedef vector VL;
typedef vector VI;
typedef vector VS;
typedef pair PII;
typedef vector VPII;
typedef pair PIII;
typedef pair PDD;
typedef pair PDI;
typedef pair PCI;
typedef pair PSI;
typedef pair PIS;
typedef pair PIC;
typedef pair PLL;
typedef __int128 i128;
typedef unsigned long long ULL;
const int N =1e6 + 10,M = N * 5,base =400  ,INF = 0x3f3f3f3f,P = 131;
const double eps = 1e-8;
const int mod = 998244353;
const LL LNF=(LL) INF * INF;

int n;

LL gcd(LL a,LL b) // 最大公约数 
{
	return b?gcd(b,a%b):a;
}
LL lcm(LL a,LL b) // 最小公倍数 
{
	return a * b / gcd(a,b);
}
// ai 第i个糖果的总个数 
// bi 第i个糖果的单个费用 
// ci 打包完 一包糖果的价格 
// di 一包糖果的数量 

inline void solve()
{
	cin >> n;
	VL a(n+1),b(n+1); 
	fu(i,1,n) cin >> a[i] >> b[i];
	
	LL g=0,m = 1; 
	
	int ans = 1; 
	
	fu(i,1,n)
	{
		if(gcd(g,a[i] * b[i]) % lcm(m,b[i]) != 0 ) // 需要新增一个ci区间
		{
			ans++;
			g=0,m = 1; 
		}
		g = gcd(g,a[i] * b[i]);
		m = lcm(m,b[i]);
	}
	
	cout << ans <>t;
    int now = 1;
    while(t -- )
    {
//      cout<<"Case "; 
//      cout<<"Case #"; 
//      cout<<"Scenario #"; 
//      cout<< now ++ <<": ";
//      cout<< now ++ <<": \n";
        solve();
    }


    return 0;
}

 

 

你可能感兴趣的:(#,最大公约数,c语言,c++,算法)