USACO 合集

第一篇这个站上的博客,总结USACO的程序
总结一下思路

USACO1.1

  • Your Ride Is Here

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char a[10],b[10];
    int main(){
    int i,j,k,n=1,m=1,l1,l2;
    scanf("%s%s",&a,&b);
    l1=strlen(a);
    l2=strlen(b);
    for(i=0;i<l1;i++){
    n*=a[i]-'A'+1;
    n%=47;
    }
    for(i=0;i<l2;i++){
    m*=(int)b[i]-'A'+1;
    m%=47;
    }
    if(n==m) printf("GO\n");
    else printf("STAY\n");
    return 0;
    }
  • Greedy Gift Givers

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    const int maxn=10+10,maxl=14+10;
    char s[maxn][maxl],c[maxl];
    int a[maxn];
    int main(){
    int i,j,k,n,m;
    int x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%s",s[i]);
    while(scanf("%s%d%d",c,&x,&y)!=EOF){
    if(y==0) continue;
    for(i=1;i<=n;i++)
    if(!strcmp(c,s[i]))
    a[i]+=(x/y)*y;
    for(i=1;i<=y;i++){
    scanf("%s",c);
    for(j=1;j<=n;j++)
    if(!strcmp(c,s[j]))
    a[j]-=x/y;
    }
    }
    for(i=1;i<=n;i++)
    printf("%s %d\n",s[i],-1*a[i]);
    return 0;
    }
  • Friday the Thirteenth

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    bool pd(int x){
    return x%400==0 || (x%100!=0 && x%4==0);
    }
    int ans[7];
    int main(){
    int i,j,k=13,n,m;
    scanf("%d",&n);
    for(i=1900;i<1900+n;i++)
    for(j=1;j<=12;j++){
    k%=7;
    ans[k]++;
    if(j==2){
    if(pd(i)) k+=29;
    else k+=28;
    }
    else if(j==4 || j==6 || j==9 || j==11) k+=30;
    else k+=31;
    }
    printf("%d %d ",ans[6],ans[0]);
    for(i=1;i<=5;i++)
    printf("%d ",ans[i]);
    return 0;
    }
  • Broken Necklace

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=350*2+10;
    int a[maxn],ls,rs;
    int main(){
    int i,j,k,k1,n,m;
    scanf("%d",&n);
    char s[maxn],c;
    scanf("%s",s);
    for(i=1;i<=n;i++){
    c=s[i-1];
    if(c=='r') a[i]=a[i+n]=1;
    if(c=='b') a[i]=a[i+n]=2;
    if(c=='w') a[i]=a[i+n]=3;
    }
    int Max=0;
    m=n*2;
    for(i=1;i<=m;i++){
    if(k1==3) ls++,k1=a[i];
    else if(ls==0) ls=1,k1=a[i];
    else if(k1==a[i] || a[i]==3) ls++;
    else{
    ls=1,k1=a[i];
    j=i-1;
    while(a[j]==3) j--,ls++;
    }
    rs--;
    if(rs<1){
    rs=1;
    j=i+1;
    while(a[j]==3) j++,rs++;
    k=j+1;
    while((a[j]==a[k] || a[k]==3) && j+1<=m) k++,rs++;
    }
    if(ls+rs>Max){
    Max=ls+rs;
    }
    if(Max>=n){
    printf("%d\n",n);
    return 0;
    }
    }
    printf("%d\n",Max);
    return 0;
    }

USACO1.2

  • Milking Cows

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=5000+10;
    struct point{
    int s,t;
    }a[maxn];
    bool cmp(point A,point B){
    return A.s<B.s;
    }
    int x,y;
    int Maxlast,Maxfree;
    int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%d%d",&a[i].s,&a[i].t);
    sort(a+1,a+n+1,cmp);
    x=a[1].s;
    y=a[1].t;
    Maxlast=max(Maxlast,y-x);
    for(i=2;i<=n;i++){
    if(a[i].s<=y){
    if(a[i].t>y) y=a[i].t;
    }
    else{
    Maxfree=max(Maxfree,a[i].s-y);
    x=a[i].s;
    y=a[i].t;
    }
    Maxlast=max(Maxlast,y-x);
    }
    printf("%d %d\n",Maxlast,Maxfree);
    return 0;
    }
  • Transformations

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char n,a[11][11],b[11][11],c[11][11];
    bool pd(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    if(b[i][j]!=c[i][j])
    return false;
    return true;
    }
    void work1(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    b[j][n-i+1]=a[i][j];
    }
    void work2(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    b[n-i+1][n-j+1]=a[i][j];
    }
    void work3(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    b[n-j+1][i]=a[i][j];
    }
    void work4(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    b[i][n-j+1]=a[i][j];
    }
    void work6(){
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    b[i][j]=a[i][j];
    }
    void work5(){
    work4();
    int i,j;
    for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    a[i][j]=b[i][j];
    }
    int main(){
    int i,j,k,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%s",a[i]+1);
    for(i=1;i<=n;i++)
    scanf("%s",c[i]+1);
    work1();
    if(pd()){
    puts("1");
    return 0;
    }
    work2();
    if(pd()){
    puts("2");
    return 0;
    }
    work3();
    if(pd()){
    puts("3");
    return 0;
    }
    work4();
    if(pd()){
    puts("4");
    return 0;
    }
    work6();
    if(pd()){
    puts("6");
    return 0;
    }
    work5();
    work1();
    if(pd()){
    puts("5");
    return 0;
    }
    work2();
    if(pd()){
    puts("5");
    return 0;
    }
    work3();
    if(pd()){
    puts("5");
    return 0;
    }
    puts("7");
    return 0;
    }
  • Palindromic Squares

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int a[100+10],b[100+10],alen=0,blen=0;
    bool pd(){
    int i;
    for(i=1;i<=blen/2;i++)
    if(b[i]!=b[blen-i+1])
    return false;
    return true;
    }
    void out(){
    int i;
    for(i=alen;i>=1;i--)
    if(a[i]>=10) printf("%c",a[i]-10+'A');
    else printf("%d",a[i]);
    putchar(' ');
    for(i=blen;i>=1;i--)
    if(b[i]>=10) printf("%c",b[i]-10+'A');
    else printf("%d",b[i]);
    putchar('\n');
    }
    void work(int x){
    int i,j,k=x*x;
    int y=x;
    alen=0;
    blen=0;
    while(y>0){
    a[++alen]=y%n;
    y/=n;
    }
    while(k>0){
    b[++blen]=k%n;
    k/=n;
    }
    if(!pd()) return;
    out();
    }
    int main(){
    int i,j,k,m;
    scanf("%d",&n);
    for(i=1;i<=300;i++)
    work(i);
    return 0;
    }
  • Dual Palindromes

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n;
    int b[100+10],blen=0;
    bool pd(){
    int i;
    for(i=1;i<=blen/2;i++)
    if(b[i]!=b[blen-i+1])
    return false;
    return true;
    }
    bool work(int x,int y){
    int i,j,k=x;
    blen=0;
    while(k>0){
    b[++blen]=k%y;
    k/=y;
    }
    return pd();
    }
    int main(){
    int i,j,k,m;
    scanf("%d%d",&n,&m);
    int sum=0;
    for(i=m+1;sum<n;i++){
    int num=0;
    for(j=2;j<=10;j++)
    if(work(i,j)) num++;
    if(num>=2){
    printf("%d\n",i);
    sum++;
    }
    }
    return 0;
    }

USACO1.3

  • Mixing Milk

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=5000+10;
    struct point{
    int x,y;
    }a[maxn];
    bool cmp(point A,point B){
    return A.x<B.x;
    }
    int main(){
    int i,j,k,n,m;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    scanf("%d%d",&a[i].x,&a[i].y);
    sort(a+1,a+m+1,cmp);
    i=0;
    int ans=0;
    while(1){
    i++;
    if(n<=a[i].y){
    ans+=a[i].x*n;
    break;
    }
    else{
    ans+=a[i].x*a[i].y;
    n-=a[i].y;
    }
    }
    printf("%d\n",ans);
    return 0;
    }
  • Barn Repair

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=200+10;
    int a[maxn],k[maxn];
    int main(){
    int i,j,n,m;
    int s,c;
    int last;
    scanf("%d%d%d",&m,&s,&c);
    for(i=1;i<=c;i++)
    scanf("%d",&k[i]);
    sort(k+1,k+c+1);
    last=k[1];
    for(i=2;i<=c;i++){
    a[i-1]=k[i]-last-1;
    last=k[i];
    }
    sort(a+1,a+c);
    int ans=c;
    for(i=1;i<=c-m;i++)
    ans+=a[i];
    printf("%d\n",ans);
    return 0;
    }
  • Prime Cryptarithm

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    bool p[10];
    int num[10],ans;
    bool pd(int x){
    while(x>0){
    if(!p[x%10]) return false;
    x/=10;
    }
    return true;
    }
    int sw(int x){
    int sum=0;
    while(x>0){
    sum++;
    x/=10;
    }
    return sum;
    }
    int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
    scanf("%d",&num[i]);
    p[num[i]]=true;
    }
    int a,b,c,d,e;
    int x,y;
    for(a=1;a<=n;a++)
    for(b=1;b<=n;b++)
    for(c=1;c<=n;c++){
    x=num[a]*100+num[b]*10+num[c];
    for(d=1;d<=n;d++)
    if(pd(x*num[d]) && sw(x*num[d])==3)
    for(e=1;e<=n;e++)
    if(pd(x*num[e]) && pd(x*(num[d]*10+num[e])) && sw(x*num[e])==3 && sw(x*(num[d]*10+num[e]))==4){
    ans++;
    }
    }
    printf("%d\n",ans);
    return 0;
    }
  • wormhole

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=12+10;
    #define next Next
    struct point{
    int x,y;
    }a[maxn];
    int n,next[maxn],part[maxn];
    bool cmp(point A,point B){
    return A.y<B.y || (A.y==B.y && A.x<B.x);
    }
    bool pd(){
    int i,j,tmp;
    for(i=1;i<=n;i++){
    tmp=i;
    for(j=1;j<=n;j++)
    tmp=next[part[tmp]];
    if(tmp!=0) return true;
    }
    return false;
    }
    int dfs(){
    int tot=0,i;
    for(i=1;i<=n;i++)
    if(part[i]==0)
    break;
    if(i>n){
    if(pd()) return 1;
    return 0;
    }
    int j;
    for(j=i+1;j<=n;j++)
    if(part[j]==0){
    part[j]=i;
    part[i]=j;
    tot+=dfs();
    part[i]=0;
    part[j]=0;
    }
    return tot;
    }
    int main(){
    int i,j,k,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%d%d",&a[i].x,&a[i].y);
    sort(a+1,a+n+1,cmp);
    int sum=0;
    for(i=1;i<=n-1;i++)
    if(a[i].x<a[i+1].x && a[i].y==a[i+1].y)
    next[i]=i+1;
    printf("%d\n",dfs());
    return 0;
    }
  • Ski Course Design

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1000+10,inf=1e9;
    int a[maxn];
    int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    int Min=inf;
    for(i=a[1];i<=a[n]-17;i++){
    int tmp=0;
    j=1;
    while(a[j]<i){
    tmp+=(i-a[j])*(i-a[j]);
    j++;
    }
    j=n;
    while(a[j]-i>17){
    tmp+=(a[j]-i-17)*(a[j]-i-17);
    j--;
    }
    Min=min(tmp,Min);
    }
    printf("%d\n",Min);
    return 0;
    }
  • Combination Lock

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=100+1;
    bool p[maxn][maxn][maxn];
    int main(){
    int i,j,k,n,m;
    int sum=0;
    int x,y,z;
    scanf("%d",&n);
    scanf("%d%d%d",&x,&y,&z);
    for(i=-2;i<=2;i++)
    for(j=-2;j<=2;j++)
    for(k=-2;k<=2;k++)
    p[(x+n+i)%n][(y+n+j)%n][(z+n+k)%n]=1;
    scanf("%d%d%d",&x,&y,&z);
    for(i=-2;i<=2;i++)
    for(j=-2;j<=2;j++)
    for(k=-2;k<=2;k++)
    p[(x+n+i)%n][(y+n+j)%n][(z+n+k)%n]=1;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    for(k=0;k<n;k++)
    if(p[i][j][k])
    sum++;
    printf("%d\n",sum);
    return 0;
    }

USACO1.4

  • Arithmetic Progressions

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxm=250,maxn=25+1;
    bool p[maxm*maxm*2+1];
    bool vis;
    int n,m,Max,tmp,a[maxm*maxm*2+1];
    void work(){
    int i,j;
    for(i=0;i<=m;i++)
    for(j=0;j<=m;j++){
    p[i*i+j*j]=1;
    if(i*i+j*j>Max) Max=i*i+j*j;
    }
    for(i=0;i<=Max;i++)
    if(p[i])
    a[++tmp]=i;
    return;
    }
    int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    int a1,b;
    work();
    sort(a+1,a+n+1);
    for(b=1;b<=Max;b++)
    for(a1=1;a1<=tmp && b*(n-1)+a[a1]<=Max;a1++){
    for(k=1;k<n;k++)
    if(!p[a[a1]+b*k])
    break;
    if(k==n){
    printf("%d %d\n",a[a1],b);
    vis=1;
    }
    }
    if(!vis) puts("NONE");
    return 0;
    }
  • Mother’s Milk

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=20+10;
    int vis[maxn][maxn],p[maxn];
    int max_a,max_b,max_c;
    void dfs(int x,int y,int z){
    if(x>max_a || y>max_b || z>max_c) return;
    if(x<0 || y<0 || z<0) return;
    if(vis[x][y]) return;
    vis[x][y]=1;
    if(x==0) p[z]=1;
    dfs(0,y+x,z);
    dfs(0,y,z+x);
    dfs(x-max_b+y,max_b,z);
    dfs(x-max_c+z,y,max_c);
    dfs(x+y,0,z);
    dfs(x,0,y+z);
    dfs(max_a,y-max_a+x,z);
    dfs(x,y-max_c+z,max_c);
    dfs(x+z,y,0);
    dfs(x,z+y,0);
    dfs(max_a,y,z-max_a+x);
    dfs(x,max_b,z-max_b+y);
    }
    int main(){
    int i,j,k,n,m;
    scanf("%d%d%d",&max_a,&max_b,&max_c);
    dfs(0,0,max_c);
    for(i=0;i<=20;i++)
    if(p[i])
    printf("%d ",i);
    putchar('\n');
    return 0;
    }

USACO1.5

  • Number Triangles

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1001,inf=-1e9;
    int f[maxn*maxn];
    int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=1;i<=n*(n-1)/2;i++)
    f[i]=inf;
    for(i=1;i<=n;i++)
    for(j=i*(i-1)/2+1;j<=i*(i+1)/2;j++){
    scanf("%d",&k);
    if(i==1) f[j]=k;
    if(j!=1) f[j]=max(f[j],k+f[j-i]);
    if(j!=i*(i+1)/2) f[j]=max(f[j],k+f[j-i+1]);
    }
    int Max=inf;
    for(i=n*(n-1)/2+1;i<=n*(n+1);i++)
    Max=max(Max,f[i]);
    printf("%d\n",Max);
    return 0;
    }
  • Prime Palindromes

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1000000+10;
    int a[11],num,n,m;
    int ans[maxn],tmp;
    void pd(){
    int i,sum=0;
    for(i=1;i<=(num+1)/2;i++)
    sum=sum*10+a[i];
    for(i=num/2;i>=1;i--)
    sum=sum*10+a[i];
    int x=(int)sqrt(sum);
    if(sum<n) return;
    if(sum>m) return;
    for(i=2;i<=x;i++)
    if(sum%i==0)
    return;
    ans[++tmp]=sum;
    }
    void work(int x){
    int i;
    if(x==0){
    pd();
    return;
    }
    for(i=0;i<=9;i++){
    a[x]=i;
    work(x-1);
    }
    }
    int main(){
    int i,j,k;
    scanf("%d%d",&n,&m);
    if(n<=2) puts("2");
    int x=n,y=m,xsum=0,ysum=0;
    while(x>0){
    x/=10;
    xsum++;
    }
    while(y>0){
    y/=10;
    ysum++;
    }
    for(i=xsum;i<=ysum;i++){
    num=i;
    work((i+1)/2);
    }
    sort(ans+1,ans+tmp+1);
    for(i=1;i<=tmp;i++)
    printf("%d\n",ans[i]);
    return 0;
    }
  • Superprime Rib

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a[4]={2,3,5,7},sum=0;
    bool pd(){
    int i;
    int x=(int)sqrt(sum);
    for(i=2;i<=x;i++)
    if(sum%i==0)
    return false;
    return true;
    }
    void dfs(int x){
    int i;
    if(!pd()) return;
    if(x==0) printf("%d\n",sum);
    for(i=1;i<=9;i+=2){
    sum=sum*10+i;
    dfs(x-1);
    sum/=10;
    }
    }
    int main(){
    int i,j,k,n,m;
    scanf("%d",&n);
    for(i=0;i<4;i++){
    sum=a[i];
    dfs(n-1);
    }
    return 0;
    }

USACO2.1

USACO2.2

USACO2.3

USACO2.4

USACO3.1

USACO3.2

USACO3.3

USACO3.4

USACO4.1

USACO4.2

USACO4.3

USACO4.4

USACO5.1

USACO5.2

USACO5.3

USACO5.4

USACO5.5