Educational Codeforces Round 81 (Rated for Div. 2)

♀尐吖头ヾ 提交于 2020-01-30 21:25:51

A - Display The Number

思路:两个就可以组成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 }

B - Infinite Prefixes

思路:。。没想出。后来看了原来可以用前缀和写,把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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!