传送门

加不了了,因为CF挂了。

ProPro

给你nnn109n \le 10^9,要你输出一个字符串ss,使得ssnn个子串为13371337,且s105|s|\le 10^5

SolSol

1.1337......71337......7nn77?但是题目说s105|s| \le 10^5,绝对会挂掉。

2.1.......1337......71.......1337......7?前面aa11bb77,只要找到a,ba,b,使得a×b=na \times b = n即可,但是nn为质数时就挂了。

3.3.考虑13371337这样串的特性,发现1177只能对答案造成nn级别的贡献,但是33能对答案造成n2n^2级别的贡献。

构造一个这样的串1....13....31...13....31....13...371....13....31...13....31....13...37

这样我们有足够多的33,可能对答案造成很多贡献。

继续yy,发现一个11对答案的贡献是((它后面33的个数)()*(它后面33的个数1)/2-1)/2

于是,我们要把nn拆分成i×(i1)2×j\sum \frac{i \times(i-1)}{2} \times j的形式。

第一眼看上去,我们预处理i×(i1)2\frac {i \times (i-1)}{2},这不就是裸的背包吗?

但是仔细考虑之后,发现原来比背包还要简单,因为2×1/2=12 \times 1 /2 =1,所以保证了有解,而且i×(i1)2\frac {i \times (i-1)}{2}分布得比较紧密,完全可以用一个贪心算法求出解:

while (n>0){
    int pos=upper_bound(Data+1,Data+MAXN,n)-Data-1;
    vis[pos]++;
    n-=Data[pos];
}

求出解后,我们得到了visvis数组,代表你需要vis[i]vis[i]11,它的后面有ii33

这不就好搞了吗,差分一下即可。

为什么串的长度能控制在10510^5之内,感性理解一下,取数是贪心取的,串中33的数量大概就是n\sqrt n级别的,然而109<105\sqrt {10^9} < 10^5,再算上1177之类的边边角角大概不会超过。

#include <bits/stdc++.h>
#define MAXN 100005
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9'){
        if (ch=='-') f=-1;
        ch=getchar();
    }
    while (ch>='0'&&ch<='9'){
        x=(x<<3)+(x<<1)+(ch^'0');
        ch=getchar();
    }
    return x*f;
}
int Data[MAXN];
int vis[MAXN];
inline void Put(char ch,int t){
    for (register int i=1;i<=t;++i){
        putchar(ch);
    }
}
#undef int
int main(){
#define int long long
    int t=read();
    for (register int i=1;i<MAXN;++i){
        Data[i]=i*(i+1)/2ll;
    }
    while (t--){
        int n=read();
        memset(vis,0,sizeof(vis));
        while (n>0){
            int pos=upper_bound(Data+1,Data+MAXN,n)-Data-1;
            vis[pos]++;
            n-=Data[pos];
        }
        int lst=-1;
        for (register int i=MAXN-1;i>=0;--i){
            if (vis[i]){
                if (lst!=-1) Put('3',lst-i);
                Put('1',vis[i]);
                lst=i;
            }
        }
        Put('3',lst+1);
        Put('7',1);
        printf("\n");
    }
}