D. Print a 1337-string...(组合数学)

地址:https://codeforces.com/problemset/problem/1202/D

题意:给出n,构造含有n个子1337的字符串。

解析:本来想的是1.....1337的,但是看数据s=1e5,而n达到了1e9,显然不行。

对于n的贡献,3是最大的,而7又是消耗最少的。所以可以构造133/777....../33......7

对于第一组1337,7的个数即为可构造的种类数。

第二组的末尾7,构造数取决于所有3的数目:x*(x-1)/2

所以先算出x*(x-1)/2<=n的最大x,n-减去x*(x-1)/2即为需要补的中间7的数目,x-2即为去掉第一组3后需要打印的3的数目。

最后结尾打个7。

算了一下,这个不会超:

3的个数x,对答案的贡献是x*(x-1)/2,考虑极端情况,n=1e9,x也就大概1e4.5而已。不够的用7去补就可以了,不会超1e5。

#include<bits/stdc++.h>
#include<map>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        cout<<"133";
        int b=1;
        while(b*(b-1)/2<=n)
        {
            b++;
        }
        b--;
        for(int i=1;i<=n-b*(b-1)/2;i++)
            cout<<"7";
        for(int i=1;i<=b-2;i++)
            cout<<"3";
        cout<<"7"<<endl;
    }
}

猜你喜欢

转载自www.cnblogs.com/liyexin/p/12934492.html