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 }