Codeforces849C From Y to Y

45 篇文章 0 订阅
40 篇文章 0 订阅

标签:模拟

From beginning till end, this message hasbeen waiting to be conveyed.

For a given unordered multiset of nlowercase English letters ("multi" means that a letter may appearmore than once), we treat all letters as strings of length 1, and repeat thefollowing operation n - 1 times:

  • Remove any two elements s and t from the set, and add their concatenation s + t to the set.

The cost of such operation is defined to be, where f(s, c) denotes the number of times characterc appears in string s.

Given a non-negative integer k,construct any valid non-empty set of no more than 100 000 letters, such that the minimum accumulative cost of the wholeprocess is exactly k. It can be shown that a solution always exists.

Input

The first and only line of input contains anon-negative integer k (0 ≤ k ≤ 100 000) — the required minimum cost.

Output

Output a non-empty string of no more than 100 000 lowercase English letters — any multiset satisfying therequirements, concatenated to be a string.

Note that the printed string doesn't needto be the final concatenated string. It only needs to represent an unorderedmultiset of letters.

Example

Input

12

Output

abababab

Input

3

Output

codeforces

Note

For the multiset {'a', 'b', 'a', 'b', 'a', 'b','a', 'b'}, one of the ways to complete the process is as follows:

  • {"ab", "a", "b", "a", "b", "a", "b"}, with a cost of 0;
  • {"aba", "b", "a", "b", "a", "b"}, with a cost of 1;
  • {"abab", "a", "b", "a", "b"}, with a cost of 1;
  • {"abab", "ab", "a", "b"}, with a cost of 0;
  • {"abab", "aba", "b"}, with a cost of 1;
  • {"abab", "abab"}, with a cost of 1;
  • {"abababab"}, with a cost of 8.

The total cost is 12, and it can be provedto be the minimum cost of the process.

 

 

题意:给你一个字符串序列的最小价值,求该字符串本身,反正题意十分不明确

最小价值:定义每个小写字母在字符串中出现x次,那么cost=sum(x*(x+1)/2)

题目中那些玄学的价值计算方法都是浮云,实际上就是反着倒退模拟,

参考代码

#include<bits/stdc++.h>
using namespace std;

int n,k;
int main()
{
	cin>>n;
	for(int i=1;i<=26;i++)
	{
		k=1;
		while(k*(k+1)/2<=n)k++;
		n-=k*(k-1)/2;
		for(int j=1;j<=k;j++)printf("%c",'a'+i-1);
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值