【XSY1522】灯 乱搞

来源:互联网 发布:交通违章查询软件下载 编辑:程序博客网 时间:2024/06/05 06:04

题目大意

​  n盏灯排成一列,标号1n,一开始标号为1的灯亮着。

​  现在依次对于2~n的每一个质数pi,指定一盏亮着的灯ai,点亮所有标号为ai±kpi的灯。

  输出任意一种方案即可

​  n100000

题解

​  我们可以把灯的编号减1,变成0~n1

​  先用线性筛把质数筛出来

​  如果对于每一个质数都指定编号0的灯,就可以把除了1之外的所有灯点亮。

​  所以我们的目标是点亮1号灯

​  我们要找两个质数p1,p2,满足p1|p21,p21n,p22n,p1+p2n1,然后就可以给p1指定p1+1,给p2指定p1+p2。因为所有偶数都在p=2时被点亮了,所以这样就可以把全部灯点亮了。

​  但是我们会发现n比较小时这个方法有时候会找不到答案,我们只需要写一个暴搜把n50的情况全部搜出来。

​  我也不知道第55行的那个剪枝是不是对的反正能搜出一组解。

代码

#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>using namespace std;typedef long long ll;typedef pair<int,int> pii;int p[1000010];int b[1000010];int cnt;int a1[1000010];int a2[1000010];int a[1000010];int cnt1,cnt2;int ans[1000010];int c[1000010];int d[1000010];int n;int tcnt;void dfs(int x){    if(x>cnt)    {        int i;        for(i=1;i<=n;i++)            if(!a[i])                return;//      printf("printf(\"%d %d\\n",tcnt,n);//      for(i=1;i<=tcnt;i++)//          printf("%d\\n",ans[i]);//      printf("\");");        printf("%d %d\n",tcnt,n);        for(i=1;i<=tcnt;i++)            printf("%d\n",ans[i]);        exit(0);    }    int i,j;    for(i=1;i<=n;i++)        if(a[i])        {            int s=0;            for(j=i;j<=n;j+=p[x])            {                s+=!a[j];                a[j]++;            }            for(j=i-p[x];j>=1;j-=p[x])            {                s+=!a[j];                a[j]++;            }            ans[x]=i;            if(s)                dfs(x+1);            for(j=i;j<=n;j+=p[x])                a[j]--;            for(j=i-p[x];j>=1;j-=p[x])                a[j]--;        }}int main(){//  freopen("light.in","r",stdin);//  freopen("light.out","w",stdout);    scanf("%d",&n);    memset(b,0,sizeof b);    int i,j;    cnt=0;    for(i=2;i<=n;i++)    {        if(!b[i])            p[++cnt]=i;        for(j=1;j<=cnt&&i*p[j]<=n;j++)        {            b[i*p[j]]=1;            if(i%p[j]==0)                break;        }    }    tcnt=cnt;    if(n<=50)    {        memset(a,0,sizeof a);        a[1]=1;        if(p[cnt]==n)        {            ans[cnt]=1;            cnt--;        }        dfs(1);        printf("%d %d\n",tcnt,n-1);        for(i=1;i<=tcnt;i++)            printf("1\n");        return 0;    }    printf("%d ",tcnt);    if(p[cnt]==n)    {        ans[cnt]=1;        cnt--;    }    n--;    memset(a,0,sizeof a);    int cnt3=0;    for(i=1;i<=cnt;i++)    {        if(ll(p[i])*p[i]<=n)            a1[++cnt1]=p[i];        else        {            a2[++cnt2]=p[i];            d[++cnt3]=p[i];        }        ans[i]=1;    }    for(i=1;i<=cnt1;i++)    {        ans[i]=1;        for(j=a1[i];j<=n;j+=a1[i])            a[j]++;    }    for(i=1;i<=cnt2;i++)        c[a2[i]-1]=i;    int x=0;    for(i=cnt2;i>=1;i--)    {        for(j=a2[i];j<=n;j+=a2[i])            if(c[j]&&a2[i]+j<=n-2)            {                x=i;                ans[i+cnt1]=a2[i]+2;                ans[c[j]+cnt1]=a2[i]+j+2;                break;            }        if(x)            break;    }    printf("%d\n",n+1);    for(i=1;i<=tcnt;i++)        printf("%d\n",ans[i]);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 c1增驾b2没考过怎么办 没驾照买车怎么办行驶证 广州车辆年审加装踏板怎么办 租车感觉违章了 怎么办 武汉驾照扣12分怎么办 驾驶证照片泡水不清楚怎么办 驾驶证过了180天怎么办 天津有公司执照怎么办落户 温州车在上海年审手续怎么办 广东小高考考了d怎么办 深圳开摩托抓到怎么办 深圳车卖了车牌怎么办 a1驾照时期过了怎么办 b1驾照扣了12分怎么办 北京的驾照换证怎么办 b2汽车驾驶证年审过期几天怎么办 上海驾照到期人在外地怎么办 交警开的罚单交不了怎么办 珠海交警微信交罚单扣分怎么办 驾驶证违法罚款单子没有了怎么办 转账密码输错3次怎么办 汽车违章扣6分怎么办 汽车扣了72分年检怎么办 汽车扣了50分怎么办 汽车扣了15分怎么办 汽车扣了27分怎么办 汽车扣了40分怎么办 行驶证掉了怎么办 异地 高速上没带驾驶证行驶证怎么办 身份证驾驶证行驶证都丢了怎么办 驾驶证年审过期一个月怎么办 柴油车辆年检尾气不合格怎么办 驾驶证过期了5天怎么办 过了审车时间怎么办 骑车没带行驶证怎么办 轿车行驶证丢了怎么办 车子没年检被扣怎么办 上海车辆年检过期了怎么办 行驶证过期十天怎么办 行驶证盖章满了怎么办 驾照c证扣12分怎么办