교육 Codeforces 라운드 81 (사업부 정격. 2)

A. 디스플레이 넘버

문제 해결

질문의 더 나은 번호를 물었고, 대답은, LONGLONG 버스트 암시 한 것입니다
우리는 다음과 같은 정책을 수 있도록 :
\ (\ N- 형이) 도 전체 채우기입니다 (\ 1) \ 있기 때문에, \ (1 \) 두 세포, 그 가치는
\ (n \) 홀수 후 제 미친 채움 \ (1 \) , 그리고 왼쪽 \ (3 \) 채우기 위해 시간 \ (7 \) 잘을

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int w[10]={6,2,5,5,4,5,6,3,7,6};
int T,n; 
int main()
{
    T=read();
    while(T--)
    {
        n=read();
        if(n%2==0)
            for(int i=1;i<=n/2;i++)printf("1");
        else
        {
            printf("7");
            for(int i=1;i<n/2;i++)printf("1");
        }
        printf("\n");   
    }
    return 0;
}

B. 무한 접두사

문제 해결

오랜 시간 동안 에세이 카드, 언어 솔루션을 설명하는 방법을 열심히 생각

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int maxn=100010;
int T,n,x,p0[maxn],p1[maxn],pre[maxn],MAX;
char s[maxn];
int main()
{
    T=read();
    while(T--)
    {
        mem(p0,0);mem(p1,0);mem(pre,0);
        n=read();x=read();
        int cnt=0;
        scanf("%s",s+1);
        for(int i=1;i<=n;i++)p0[i]=p0[i-1]+(s[i]=='0'),p1[i]=p1[i-1]+(s[i]=='1'),pre[i]=p0[i]-p1[i];
        if(x==0)cnt=1;
        if(pre[n])
        {
            for(int i=1;i<=n;i++)if((x-pre[i])%pre[n]==0 && (x-pre[i])/pre[n]>=0)cnt++;
        }
        else
        {
            for(int i=0;i<=n;i++)if(x==pre[i])cnt++;
        }
        if(!pre[n] && cnt)printf("-1\n");
        else printf("%d\n",cnt);
    }
    return 0;
}

C.는 문자열을 얻어서

문제 해결

특히 문자열 일치하는 것으로
하지만 난 문자열 일치 지연 저장, 그것은 템플릿 문자열 전처리를하지 않았다.
집합 \ (프리 [I]는 \) 문자를 나타내는 \ (I \) 초기의 위치이다 \ (SUF [I] [J]를 \) 부분에 도시 나타낸다 \ (I \) 후 문자, 문자 \ (J \ ) 초기 위치는,이 수 ) \ \ (O (26n)를 출력 전처리
후 주위 상단 반복적 크로스 바로 이동할

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline int read()
{
    int x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
const int maxl=100010;
int T;
char s[maxl],t[maxl];
int pre[30],suf[maxl][30];//pre(i)表示字符i最早出现位置 ,suf(i,j)表示在i字符后,字符j最早出现位置 
int main()
{
    T=read();
    while(T--)
    {
        mem(pre,42);mem(suf,42);
        scanf("%s%s",s,t);
        int l1=strlen(s),l2=strlen(t),cnt=0,ok=0;
        for(int i=0;i<l1;i++)pre[s[i]-'a']=min(pre[s[i]-'a'],i);
        for(int i=0;i<l1-1;i++)suf[i][s[i+1]-'a']=i+1;
        for(int i=l1-1;i>=0;i--)
            for(int j=0;j<26;j++)suf[i][j]=min(suf[i][j],suf[i+1][j]);
        for(int i=0;i<l2;)
        {
            ++cnt;
            int pos=pre[t[i]-'a'];i++;
            if(pos>=l1){ok=1;break;}
            while(suf[pos][t[i]-'a']<l1)pos=suf[pos][t[i]-'a'],i++;
        }
        if(!ok)printf("%d\n",cnt);
        else printf("%d\n",-1);
    }
    return 0;
}

D. 같은 GCDs

문제 해결

집합 \ (GCD (A, m) = X \) 있다 \ (a = k_1x, m =
k_2x \) 알 수도 \ (GCD (A + B, m) = X \) , 거기를 \ (A + B = k_3x \)
문제는 이제 닫힌 간격으로된다 (\ [k_1, k_1 k_2-1 + ] \) 내부의 숫자 (K_2 \) \ 프라임
프리픽스 문제로 나누어, \ N- (\) 포함과 배제 요인의 원칙에 품질 요소의 분해 후
유사한 문제가 이 링크입니다

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long LL;
typedef pair<int,int> PII;
#define X first
#define Y second
inline LL read()
{
    LL x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}
    return x*f;
}
int T;
LL a,m,x,k1,k2;
LL gcd(LL a,LL b){return b==0 ? a : gcd(b,a%b);}
#include<vector> 
vector<LL> pme;
LL count_prime(LL x,LL n){
    pme.clear();
    LL i,j;
    for(i=2;i*i<=n;i++)
        if(n%i==0){
            pme.push_back(i);
            while(n%i==0)n/=i;
        }
    if(n>1)pme.push_back(n);
    LL sum=0,value,cnt;
    for(i=1;i<(1<<pme.size());i++){
        value=1;
        cnt=0;
        for(j=0;j<pme.size();j++){
            if(i&(1<<j)){
                value*=pme[j];
                cnt++;
            }
        }
        if(cnt&1)
            sum+=x/value;
        else sum-=x/value;
    }
    return x-sum;
}
int main()
{
    T=(int)read();
    while(T--)
    {
        a=read();m=read();
        x=gcd(a,m);
        k1=a/x;k2=m/x;
        cout<<count_prime(k2+k1-1,k2)-count_prime(k1-1,k2)<<endl;
    }
    return 0;
}

무의미한 말

문제와 뇌 여부, 거래는 너무 느린 아입니다

추천

출처www.cnblogs.com/FYH-SSGSS/p/12241935.html