码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #246 (Div. 2)

时间:2014-05-23 04:49:08      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   tar   

C 这题说的是给了一个数列然后通过交换得到有序的数组 数列中的数只有满足距离j-i+1 为素数的时候才可以交换然后 根据哥德巴赫猜想就可以知道数之间的关系 然后通过交换得到他们的值,这里犯了一个严重的错误就是在计算的时候L[a[i]] 与 L[i] 的地址交换了 但是是 a[i] 与a[L[i]] 的值却没有发生交换导致了 一直wa 要知道是通过值得下标值去访问地址的然后就可以得到要的地址 只交换了地址却没有交换值  记住这个错误

bubuko.com,布布扣
#include <iostream>
#include<string.h>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 100005;
int a[maxn+5],L[maxn+5],prime[maxn+5],numPrime,X[maxn*5+5],Y[maxn*5+5],n,num;
bool vis[maxn*10];
void inti(){
   int m = (int)sqrt(maxn + 0.5);
    memset(vis,false,sizeof(vis));
    vis[1]=true;
     for(int i = 2; i <= m; ++ i)
        if(vis[i] == false)
            for(int j = i * i; j <= maxn+100; j += i)
                vis[j] = true;

}
void look(int &a,int &b,int G){
      int t1;
      t1=G/2;
      while(true){
        if(vis[t1]==0&&vis[G-t1]==0) break;
        t1--;
      }
      a=t1;
      b=G-t1;
}
void jud(int a,int b){

   if(a<b){
      X[num]=a; Y[num]=b;
   }
   else{
      X[num]=b; Y[num]=a;
   }
   num++;
}
int main()
{


    inti();
   while( scanf("%d",&n)==1){
         num=0;
    for(int i=1;i<=n; ++i){
        scanf("%d",&a[i]);
        L[a[i]]=i;
    }
    for(int i =1 ;i<= n ; ++i){
        if(L[i]==i) continue;
        int L1 = L[i];
        int L2 = i;

        L[a[i]]=L[i];
        L[L2] =L2;
        int tt=a[i];
        a[i]=i;
        a[L1]=tt;
        if(vis[L1-L2+1]==0){
            jud(L2,L1);
            continue;
        }
        if((L1-L2)&1){
           int aa,bb;
           look(aa,bb,L1-L2+1);
           int L3=L2+1;
           int L4=L3-1+aa;
            jud(L2,L3);
            jud(L3,L4);
            jud(L4,L1);
            jud(L3,L4);
            jud(L2,L3);
        }
        else{
            int aa,bb;
            look(aa,bb,L1-L2+2);
            int L3=L2+aa-1;
            jud(L2,L3);
            jud(L3,L1);
            jud(L2,L3);
        }
     }
      printf("%d\n",num);
      for(int i=0;i<num; ++i)
        printf("%d %d\n",X[i],Y[i]);
    }
    return 0;
}
Viewdfdf          

Codeforces Round #246 (Div. 2),布布扣,bubuko.com

Codeforces Round #246 (Div. 2)

标签:style   class   blog   c   code   tar   

原文地址:http://www.cnblogs.com/Opaser/p/3737909.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!