codeforces1202D Print a 1337-string...

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

题意:T组,每次给你一个数n,要求你构建输出一个字符串(len <= 1e5,只有1,3,7组成),使得这个串中有n个“1337”子串。

思路:

组合成133(B个7)((A - 2)个3)7的形式

n个子串即为B + ((A - 2) * ((A - 1) - 2) / 2), -2是因为前面有两个3哇

AC代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>

using namespace std;

int t,n,A,B;

void solve(){//i * j / 2 <= n
	int p = sqrt(n * 2);
	for(int i = p;i <= n * 2; i++){
		if(i * (i - 1) <= n * 2 && (i + 1) * i > n * 2){
			A = i;
			B = n - A * (A - 1) / 2;
			break;
		}
	}
	//A 个 3  (A * (A - 1) / 2)种排列
	printf("133");
	for(int i = 1;i <= B; i++) printf("7");
	for(int i = 1;i <= A - 2; i++) printf("3");
	printf("7\n");
}

int main()
{
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		solve();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值