思路:两个就可以组成1,那么四个就可以组成11,六个就可以组成最大111,三个就可以组成7,五个那么就是(3+2),组成71,所以当是偶数的话就组成全部是1就行,奇数就是最前面放7,后面全放1
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 #include<cstring>
5 #include<queue>
6 #include<cmath>
7 using namespace std;
8 const int maxn=1000+10;
9 int main()
10 {
11
12 int a[6]={6,7,3,4,2};
13 int n,nn;
14 scanf("%d",&n);
15 for(int i=0;i<n;i++)
16 {
17 scanf("%d",&nn);
18 if(nn%2==0)
19 {
20 int t=nn/2;
21 for(int j=0;j<t;j++)
22 printf("1");
23 printf("\n");
24 } else
25 {
26 printf("7");
27 int tt=nn/2-1;
28 for(int jj=0;jj<tt;jj++)
29 printf("1");
30 printf("\n");
31 }
32 }
33 return 0;
34 }
思路:。。没想出。后来看了原来可以用前缀和写,把1变成-1,p[i+1]=p[i]-1;0的位置变成1,p[i+!]=p[i]+1;字符串s的长度为Len,那么p[Len]就是这个单个字符串的前缀和
1.现在判断有无穷个情况,当字符串有个位置的值为x时,此时前缀和又为0,那么这肯定就是无穷的,可以加无穷多个这样的字符串
2.当前位置值为x时,但是前缀和不为0,那么这个前缀就满足了条件,个数可以+1
3.当前位置值<x时并且p[Len]>0,可以再在后面加一个这样的字符串,同样的位置的值就是p[Len]+p[i],
可以再加,所以(x-p[i])%p[Len)==0)时(可以加一定数量的字符串),那么就满足条件+1;
3.同理,当前位置值>x时并且p[Len]<0,再在后面加这样的字符串时,同样的位置的值就是p[Len]+p[i],
所以(p[i]-x)%(-p[Len])==0),那么也满足条件+1;
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 const int maxn = 1e5;
5
6 int main(){
7 int T;
8 scanf("%d",&T);
9 for(int i=0;i<T;i++)
10 {
11 int len;
12 ll x;
13 cin>>len>>x;
14 string s;
15 cin>>s;
16 int Len=s.length();
17 ll p[maxn];
18 p[0]=0;
19 for(int i=0;i<Len;i++)
20 {
21 if(s[i]=='0')
22 p[i+1]=p[i]+1;
23 else
24 p[i+1]=p[i]-1;
25 }
26 ll he=p[Len];
27 int sum=0;
28 bool flag=false;
29 for(int i=0;i<=Len;i++)
30 {
31 if(p[i]==x)
32 sum++;
33 if(p[i]==x&&he==0)
34 flag=true;
35 if(i!=0&&he>0&&p[i]<x&&(x-p[i])%he==0)
36 sum++;
37 if(i!=0&&he<0&&p[i]>x&&(p[i]-x)%(-he)==0)
38 sum++;
39 }
40 if(flag)
41 printf("-1\n");
42 else
43 printf("%d\n",sum);
44 }
45 return 0;
46 }
来源:https://www.cnblogs.com/Vampire6/p/12243588.html