Print a 1337-string... CodeForces - 1202D

原题链接

考察:构造+组合数学

错误思路:

       暴力枚举1 33 的个数,通过一些剪枝操作得到各自的长度,我们暴力枚举个数,通过它们组合数==n来求解字符串.

但是注意:

       但是注意求解组合数==n.如果n为>1e5的质数(拆成3个因子只有1*N*1一组情况).那么甚至得不到解.但题目要求是一定有解的.因此这道题不是组合数==n.而是将一组乘积无法得到的n分为两组乘积得到.比如1337337这就是分为几组乘积得到的n==2的情况.同理也可以分为多组求解,但是本题分为两组足够了.因为组合数可以在x<1e5的情况下得到>1e9的数字,这是绝对够分的

 1 #include <iostream>
 2 #include <algorithm> 
 3 using namespace std;
 4 typedef long long ll;
 5 const int N = 1e5;
 6 ll cnt[N],ed;
 7 void inits()//此方法错在如果输入的是一个n>1e5的质数,那么就输出不了答案 
 8 {
 9     for(int i=1;i<=N;i++)
10     {
11         ll tmp = (ll)i*(i-1)/2;
12         if(tmp>1e9) { ed = i-1; break; } 
13         cnt[i] = tmp;
14     }
15 }
16 void solve(int n)
17 {
18     int idx = upper_bound(cnt,cnt+ed+1,n)-cnt-1;
19     int res = n-cnt[idx];
20     printf("133");
21     while(res--) printf("7");
22     for(int i=1;i<=idx-2;i++)
23         printf("3");
24     printf("7\n");
25 }
26 int main()
27 {
28 //    freopen("in.txt","r",stdin);
29 //    freopen("out.txt","w",stdout);
30     int q,n;
31     scanf("%d",&q);
32     inits();
33     while(q--)
34     {
35         int n;
36         scanf("%d",&n);
37         solve(n);
38     }
39     return 0;
40 } 

 

posted @ 2021-01-20 02:45  acmloser  阅读(72)  评论(0编辑  收藏  举报