Educational Codeforces Round 70 (Rated for Div. 2) D. Print a 1337-string...

本文详细解析了Codeforces平台上的D级难题,探讨了如何构造特定的数字序列以匹配预定的子序列数量,通过预处理和策略性插入元素,有效地解决了问题。

D. Print a 1337-string…

题目链接: https://codeforces.com/contest/1202/problem/D

Problem Description

The subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.
You are given an integer n n n.
You have to find a sequence s s s consisting of digits { 1 , 3 , 7 } \{1,3,7\} {1,3,7} such that it has exactly n n n subsequences equal to 1337 1337 1337.
For example, sequence 337133377 337133377 337133377 has 6 6 6 subsequences equal to 1337 1337 1337:

  • 1.   337 1 ‾ 3 3 ‾ 3 ‾ 7 7 ‾ 1.\ 337\underline{1}3\underline{3}\underline{3}7\underline{7} 1. 337133377 (you can remove the second and fifth characters);
  • 2.   337 1 ‾ 3 ‾ 3 3 ‾ 7 7 ‾ 2.\ 337\underline{1}\underline{3}3\underline{3}7\underline{7} 2. 337133377 (you can remove the third and fifth characters);
  • 3.   337 1 ‾ 3 ‾ 3 ‾ 37 7 ‾ 3.\ 337\underline{1}\underline{3}\underline{3}37\underline{7} 3. 337133377 (you can remove the fourth and fifth characters);
  • 4.   337 1 ‾ 3 3 ‾ 3 ‾ 7 ‾ 7 4.\ 337\underline{1}3\underline{3}\underline{3}\underline{7}7 4. 337133377 (you can remove the second and sixth characters);
  • 5.   337 1 ‾ 3 ‾ 3 3 ‾ 7 ‾ 7 5.\ 337\underline{1}\underline{3}3\underline{3}\underline{7}7 5. 337133377 (you can remove the third and sixth characters);
  • 6.   337 1 ‾ 3 ‾ 3 ‾ 3 7 ‾ 7 6.\ 337\underline{1}\underline{3}\underline{3}3\underline{7}7 6. 337133377 (you can remove the fourth and sixth characters).

Input

The first line contains one integer t ( 1 ≤ t ≤ 10 ) t (1≤t≤10) t(1t10) — the number of queries.
Next t t t lines contains a description of queries: the i i i-th line contains one integer n i ( 1 ≤ n i ≤ 1 0 9 ) . n_i (1≤n_i≤10^9). ni(1ni109).

Output

For the i i i-th query print one string s i ( 1 ≤ ∣ s i ∣ ≤ 1 0 5 ) s_i (1≤|s_i|≤10^5) si(1si105) consisting of digits { 1 , 3 , 7 } . \{1,3,7\}. {1,3,7}. String s i s_i si must have exactly n i n_i ni subsequences 1337 1337 1337. If there are multiple such strings, print any of them.

Sample Input

2
6
1

Sample Output

113337
1337

题意

t t t次询问,每次询问给定一个 n i n_i ni.
要求构造一个只包含 1 , 3 , 7 1,3,7 1,3,7的字符串 s i ( 1 ≤ ∣ s i ∣ ≤ 1 0 5 ) s_i(1≤|s_i|≤10^5) si(1si105),要使得 s i s_i si中有 n i n_i ni 1337 1337 1337的子序列.

思路

因为对构造的字符串 s i s_i si的长度有限制,所以考虑尽量的多放一些 3 3 3来缩短所构造出的字符串。
先预处理出 C i 2 C_i^2 Ci2的值, i i i 2 2 2 44721 44721 44721,因为 C 44722 2 C_{44722}^2 C447222就已经超过了 n i n_i ni的上限,就不用处理了。
接下来就在各个 3 3 3之间尝试能不能插 1 1 1来使得 1337 1337 1337子序列的个数更接近 n i n_i ni啦。

代码

#include <bits/stdc++.h>
#define pi acos(-1.0)
#define ll long long
#define ull unsigned long long
#define esp 1e-9
#define inf 0x3f3f3f3f
#define inff 0x3f3f3f3f3f3f3f3f
#define Pair pair<ll, ll>
#define It list<node>::iterator
   
using namespace std;
 
const ll N = 5e4+5, mod = 1e9+7;
ll t, n, arr[N], cnt[N];
 
int main(){
	scanf("%lld", &t);
	//预处理
	for (ll i = 2; i <= 44721; i++){
		arr[i] = i*(i-1)/2;
	}
	while (t--){
		scanf("%lld", &n);
		memset(cnt, 0, sizeof(cnt));
		//寻找最多的3记录在m中
		ll l = 2, r = 44721, m;
		while (l <= r){
			ll mid = (l+r)/2;
			if (arr[mid] <= n){
				m = mid; l = mid+1;
			}
			else{
				r = mid-1;
			}
		}
		cnt[m]++;//在第一位放一个1
		n -= arr[m];//更新一下还差多少个子序列
		while (n){
			//在尽量靠前的位置插入1来快速缩小与n的差距
			ll l = 2, r = 44721, idx;
			while (l <= r){
				ll mid = (l+r)/2;
				if (arr[mid] <= n){
					idx = mid; l = mid+1;
				}
				else{
					r = mid-1;
				}
			}
			cnt[idx]++;//记录插入位置
			n -= arr[idx];//更新差距
		}
		//输出构造的字符串
		for (ll i = 1; i <= m; i++){
			while (cnt[m-i+1]){
				putchar('1');
				cnt[m-i+1]--;
			}
			putchar('3');
		}
		printf("7\n");
	}
 
	return 0;
}
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值