题解 CF1202D 【Print a 1337-string...】
构造题
首先如果不考虑长度限制 很容易想到这样一种构造方式:
13377...7
前面
相当于每一个
但是这样不满足长度限制
所以我们要让
于是构造出来这样一个式子:
133...3377...7
这里假设有
选取
选取
选取
都是任意取 所以乘法原理乘起来是
相当于每一个
但是题目中给定的数不一定能表示成这样 所以考虑把上面两种想法结合起来
首先在
133 77...77 33...33 77...77
这样前面的
方案数为
令这里
这样已经可以表示所有正整数了
为了保证
假设
这里直接考虑最劣情况 令
所以
这里
我这里
讲得差不多了把...上代码了
code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;
LL n,m,k,T;
LL cac = 0;
LL a[500005] = {0};
int main(){
ios::sync_with_stdio(false);
cin >> T;
LL K = 300; // K 就是上文的 n
while(T --){
cin >> n;
LL t1 = K * (K + 1) / 2,t;
// t1是上文的 N
t = n / t1;
LL tmp = n - t1 * t;
// tmp是上文的 k
cout << "133";
for(LL i = 1;i <= tmp;i ++) cout << '7';
for(LL i = 1;i < K;i ++) cout << '3';
for(LL i = 1;i <= t;i ++) cout << '7';
// 构造过程
cout << endl;
}
return 0;
}