[Codeforces] number theory (R1200) Part.4

[Codeforces] number theory (R1200) Part.4

题单:https://codeforces.com/problemset/page/6?tags=number%20theory,0-1200

787A. The Monster

原题指路:https://codeforces.com/problemset/problem/787/A

题意

给定四个整数 a , b , c , d    ( 1 ≤ a , b , c , d ≤ 100 ) a,b,c,d\ \ (1\leq a,b,c,d\leq 100) a,b,c,d  (1a,b,c,d100),求序列 { b , b + a , b + 2 a , ⋯   } \{b,b+a,b+2a,\cdots\} {b,b+a,b+2a,} { d , d + c , d + 2 c , ⋯   } \{d,d+c,d+2c,\cdots\} {d,d+c,d+2c,}中最早出现的相等项,若不存在,输出 − 1 -1 1.

思路

c c c a a a的结果与加 a a a c c c的结果相同,故有解 a x + b = c y + d ax+b=cy+d ax+b=cy+d时, x , y ≤ max ⁡ { a , b , c , d } ≤ 100 x,y\leq \max\{a,b,c,d\}\leq 100 x,ymax{a,b,c,d}100,枚举即可.

代码

void solve() {
	int a, b, c, d; cin >> a >> b >> c >> d;

	for (int i = 0; i <= 100; i++) {
		int cur = b + i * a;
		if (cur - d >= 0 && (cur - d) % c == 0) {
			cout << cur;
			return;
		}
	}
	cout << -1;
}

int main() {
	solve();
}


797A. k-Factorization

原题指路:https://codeforces.com/problemset/problem/797/A

题意

给定一个整数 n    ( 2 ≤ n ≤ 1 e 5 ) n\ \ (2\leq n\leq 1\mathrm{e}5) n  (2n1e5),将其分解为 k    ( 1 ≤ k ≤ 20 ) k\ \ (1\leq k\leq 20) k  (1k20) > 1 >1 >1的整数之积.若有解,输出任一组解;否则输出 − 1 -1 1.

思路

n n n素因数分解,结果存在一个vector中.

①若vector的元素个数 < k <k <k,无解.

②若vector的元素个数 = k =k =k,输出集合中的元素即可.

③若vector的元素个数 > k >k >k,合并若干个因数直至集合的元素个数 = k =k =k.

代码

void solve() {
	int n, k; cin >> n >> k;

	vi ans;
	for (int i = 2; i <= n / i; i++) {
		if (n % i == 0) {
			while (n % i == 0) {
				ans.push_back(i);
				n /= i;
			}
		}
	}
	if (n > 1) ans.push_back(n);

	if (ans.size() < k) cout << -1;
	else if (ans.size() == k)
		for (auto i : ans) cout << i << ' ';
	else {
		while (ans.size() > k) {
			int a = ans.back(); ans.pop_back();
			int b = ans.back(); ans.pop_back();
			ans.push_back(a * b);
		}

		for (auto i : ans) cout << i << ' ';
	}
}

int main() {
	solve();
}


817A. Treasure Hunt

原题指路:https://codeforces.com/problemset/problem/817/A

题意

给定两整数 x , y x,y x,y.现有四种操作:① ( a , b ) → ( a + x , b + y ) (a,b)\rightarrow(a+x,b+y) (a,b)(a+x,b+y);② ( a , b ) → ( a + x , b − y ) (a,b)\rightarrow(a+x,b-y) (a,b)(a+x,by);③ ( a , b ) → ( a − x , b + y ) (a,b)\rightarrow(a-x,b+y) (a,b)(ax,b+y);④ ( a , b ) → ( a − x , b − y ) (a,b)\rightarrow(a-x,b-y) (a,b)(ax,by).问是否能从点 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)经过若干次操作到达点 ( x 2 , y 2 ) (x_2,y_2) (x2,y2),若能则输出"YES";否则输出"NO".

第一行输入四个整数 x 1 , y 1 , x 2 , y 2    ( − 1 e 5 ≤ x 1 , y 1 , x 2 , y 2 ≤ 1 e 5 ) x_1,y_1,x_2,y_2\ \ (-1\mathrm{e}5\leq x_1,y_1,x_2,y_2\leq 1\mathrm{e}5) x1,y1,x2,y2  (1e5x1,y1,x2,y21e5).第二行输入两个整数 x , y    ( 1 ≤ x , y ≤ 1 e 5 ) x,y\ \ (1\leq x,y\leq 1\mathrm{e}5) x,y  (1x,y1e5).

思路

显然有解的必要条件是: ∣ x 1 − x 2 ∣   m o d   x = 0 , ∣ y 1 − y 2 ∣   m o d   y = 0 |x_1-x_2|\ \mathrm{mod}\ x=0,|y_1-y_2|\ \mathrm{mod}\ y=0 x1x2 mod x=0,y1y2 mod y=0.

下面考察能否达到 ( x 1 , y 1 ) = ( x 2 , y 2 ) (x_1,y_1)=(x_2,y_2) (x1,y1)=(x2,y2).设 c n t x = ∣ x 1 − x 2 ∣ x , c n t y = ∣ y 1 − y 2 ∣ y cnt_x=\dfrac{|x_1-x_2|}{x},cnt_y=\dfrac{|y_1-y_2|}{y} cntx=xx1x2,cnty=yy1y2.注意到每个操作都会同时使得 c n t x cnt_x cntx c n t y ± 1 cnt_y\pm 1 cnty±1,故有解的充要条件是: c n t x cnt_x cntx c n t y cnt_y cnty的奇偶性相同.

代码

void solve() {
	int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
	int x, y; cin >> x >> y;

	if ((x1 - x2) % x || (y1 - y2) % y) cout << "NO";
	else {
		int cntx = abs(x1 - x2) / x, cnty = abs(y1 - y2) / y;
		cout << ((cntx & 1) == (cnty & 1) ? "YES" : "NO");
	}
}

int main() {
	solve();
}


822A. I’m bored with life

原题指路:https://codeforces.com/problemset/problem/822/A

题意

给定两整数 a , b    ( 1 ≤ a , b ≤ 1 e 9 , min ⁡ { a , b } ≤ 12 ) a,b\ \ (1\leq a,b\leq 1\mathrm{e}9,\min\{a,b\}\leq 12) a,b  (1a,b1e9,min{a,b}12),求 gcd ⁡ ( a ! , b ! ) \gcd(a!,b!) gcd(a!,b!).

思路

显然 gcd ⁡ ( a ! , b ! ) = min ⁡ { a , b } ! \gcd(a!,b!)=\min\{a,b\}! gcd(a!,b!)=min{a,b}!.

答案最大为 12 ! ≈ 4 e 8 12!\approx 4\mathrm{e}8 12!4e8,不会爆int.

代码

void solve() {
	int a, b; cin >> a >> b;

	int ans = 1;
	for (int i = 2; i <= min(a, b); i++) ans *= i;
	cout << ans;
}

int main() {
	solve();
}


858A. k-rounding

原题指路:https://codeforces.com/problemset/problem/858/A

题意

对一个整数 n n n,定义它的 k − k- krounding为十进制下以至少 k k k个零结尾的最小的 n n n的倍数.给定两整数 n , k    ( 1 ≤ n ≤ 1 e 9 , 0 ≤ k ≤ 8 ) n,k\ \ (1\leq n\leq 1\mathrm{e}9,0\leq k\leq 8) n,k  (1n1e9,0k8),求 n n n k − k- krounding.

思路

a n s = l c m ( n , 1 0 k ) ans=\mathrm{lcm}(n,10^k) ans=lcm(n,10k).

代码

void solve() {
	int n, k; cin >> n >> k;
	cout << lcm(n, (int)pow(10, k));
}

int main() {
	solve();
}


898B. Proper Nutrition

原题指路:https://codeforces.com/problemset/problem/898/B

题意

给定三个整数 n , a , b    ( 1 ≤ a , b , n ≤ 1 e 7 ) n,a,b\ \ (1\leq a,b,n\leq 1\mathrm{e}7) n,a,b  (1a,b,n1e7),求一个非负整数对 ( x , y )   s . t .   a x + b y = n (x,y)\ s.t.\ ax+by=n (x,y) s.t. ax+by=n.若有解,输出"YES",并输出任一组解;否则输出"NO".

思路

暴力即可.

代码

void solve() {
	int n, a, b; cin >> n >> a >> b;

	for (int x = 0; x <= 1e7; x++) {
		ll cur = (ll)n - (ll)x * a;
		if (cur >= 0 && cur % b == 0) {
			cout << "YES" << endl;
			cout << x << ' ' << cur / b;
			return;
		}
	}

	cout << "NO";
}

int main() {
	solve();
}


919B. Perfect Number

原题指路:https://codeforces.com/problemset/problem/919/B

题意 ( 2   s 2\ \mathrm{s} 2 s)

求第 k    ( 1 ≤ k ≤ 1 e 4 ) k\ \ (1\leq k\leq 1\mathrm{e}4) k  (1k1e4)小的数位之和为 10 10 10的正整数.

思路

10 10 10的分拆数乘上全排列,中间还可以插 0 0 0,可估计出前 1 e 4 1\mathrm{e}4 1e4个满足条件的数不会很大,暴力求即可.

代码

void solve() {
	int k; cin >> k;

	function<bool(int)> get = [](int x)->bool {
		string s = to_string(x);
		int res = 0;
		for (auto ch : s) res += ch & 15;
		return res == 10;
	};

	int ans = 0;
	while (k) k -= get(++ans);
	cout << ans;
}

int main() {
	solve();
}


946B. Weird Subtraction Process

原题指路:https://codeforces.com/problemset/problem/946/B

题意

给定两数 a , b    ( 1 ≤ a , b ≤ 1 e 18 ) a,b\ \ (1\leq a,b\leq 1\mathrm{e}18) a,b  (1a,b1e18),现有如下三步操作:

①若 a = b = 0 a=b=0 a=b=0,操作结束,否则执行步骤②.

②若 a ≥ 2 b a\geq 2b a2b,令 a = a − 2 b a=a-2b a=a2b,执行步骤①;否则执行步骤③.

③若 b ≥ 2 a b\geq 2a b2a,令 b = b − 2 a b=b-2a b=b2a,执行步骤①;否则操作结束.

求操作结束后的 a , b a,b a,b.

思路

将若干次减法合并为一次取模,模拟该过程即可.

代码

void solve() {
	ll a, b; cin >> a >> b;

	while (a && b) {
		a %= 2 * b;
		if (!a || b < 2 * a) break;
		else b %= 2 * a;
	}
	cout << a << ' ' << b;
}

int main() {
	solve();
}


1033B. Square Difference

原题指路:https://codeforces.com/problemset/problem/1033/B

题意

在边长为 a a a的正方形的左上角切除一个边长为 b    ( b < a ) b\ \ (b<a) b  (b<a)的正方形,问剩下的L型的面积是否是素数.

t    ( 1 ≤ t ≤ 5 ) t\ \ (1\leq t\leq 5) t  (1t5)组测试数据.每组测试数据输入两个整数 a , b    ( 1 ≤ b < a ≤ 1 e 11 ) a,b\ \ (1\leq b<a\leq 1\mathrm{e}11) a,b  (1b<a1e11).

思路

注意到 a 2 − b 2 = ( a − b ) ( a + b ) a^2-b^2=(a-b)(a+b) a2b2=(ab)(a+b),显然L的面积是素数的充要条件是: a − b = 1 , a + b ∈ p r i m e s a-b=1,a+b\in primes ab=1,a+bprimes.

a + b ≤ 2 e 11 a+b\leq 2\mathrm{e}11 a+b2e11,用试除法判定素数即可.注意此处用Miller-Rabin算法中间会爆ll.

代码

bool check(ll x) {
	for (int i = 2; i <= sqrt(x); i++)
		if (x % i == 0) return false;
	return true;
}

void solve() {
	ll a, b; cin >> a >> b;
	cout << (a - b == 1 && check(a + b) ? "YES" : "NO") << endl;
}

int main() {
	CaseT  // 单测时注释掉该行
	solve();
}


1051B. Relatively Prime Pairs

原题指路:https://codeforces.com/problemset/problem/1051/B

题意 ( 2   s 2\ \mathrm{s} 2 s)

给定两个整数 l , r    ( 1 ≤ l ≤ r ≤ 1 e 18 , r − l + 1 ≤ 3 e 5 , r − l 是偶数 ) l,r\ \ (1\leq l\leq r\leq 1\mathrm{e}18,r-l+1\leq 3\mathrm{e}5,r-l是偶数) l,r  (1lr1e18,rl+13e5,rl是偶数).若能将 [ l , r ] [l,r] [l,r]中的所有整数分为 r − l + 1 2 \dfrac{r-l+1}{2} 2rl+1个数对,使得每个数在且仅在一个数对中,且每个数对的 gcd ⁡ = 1 \gcd=1 gcd=1,输出"YES"并输出一个合法方案;否则输出"NO".

思路

注意到相邻两数的 gcd ⁡ = 1 \gcd=1 gcd=1,依次输出即可.

代码

void solve() {
	ll l, r; cin >> l >> r;

	cout << "YES" << endl;
	for (ll i = l; i <= r; i += 2) cout << i << ' ' << i + 1 << endl;
}

int main() {
	solve();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值