题目:CF1202D Print a 1337-string...
很巧妙的构造题呢。
很显然我们只需要一个1。我们把数列写成1337777333333777777这种形式,就是133k个7n个3m个7,有2个3和(k+m)个7就会产生(k+m)的贡献,有n个3和m个7就会产生(n-1)*m的贡献。然后我们只要让(n-1)*m+k+m=N就可以了,其中N是输入的。由于长度限制,我们确定一下后面3的个数,直接计算就行了。这里选取的是300,足够了。
1 #include<stdio.h>
2 #define it register int
3 #define il inline
4 int n,k,len,T,nlen,ys;
5 il void fr(int &num){
6 num=0;char c=getchar();int p=1;
7 while(c<'0'||c>'9') c=='-'?p=-1,c=getchar():c=getchar();
8 while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
9 num*=p;
10 }
11 int main(){
12 k=300,len=k*(k+1)/2;
13 fr(T);
14 while(T--){
15 fr(n);
16 nlen=n/len,ys=n-nlen*len;
17 printf("133");
18 for(it i=1;i<=ys;++i) putchar('7');
19 for(it i=1;i<k;++i) putchar('3');
20 for(it i=1;i<=nlen;++i) putchar('7');
21 putchar('
');
22 }
23 return 0;
24 }