思路:两个就可以组成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(" "); 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(" "); 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 "); 42 else 43 printf("%d ",sum); 44 } 45 return 0; 46 }