Description
Smart最近想出来一个新的游戏。现在有n个灯泡,它们的编号是1~n。Smart每次说两个数,找出它们的公共质因子,且每次把它们公共质因子的倍数编号灯泡按向灯泡的相反状态(原来开按为关,原来关按为开)。
Input
有多组数据,第一行一个整数t,表示测试数据的组数。
每组测试数据的第一行一个整数n,表示灯泡数,接下来有多行,每一行一对数,当输入“0 0”时,这组测试数据结束。
Output
每组测试数据输出一行,包含两个数,分别表示最终开、关灯泡的数目。
Sample Input
1
100
4 6
0 0
Sample Output
50 50
Hint
100%的数据:t≤10,2≤n≤10^6。
筛法、模拟
1442开关灯(筛法、模拟)
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- lyh不会打代码 2023-01-01 16:42关注
点个采纳,谢谢
#include<iostream> #include<stdio.h> #include<math.h> using namespace std; int p[1000030],ip[100020],num[1000010]; int k,sum; int main() { for(int i=2;i<=1000000;i++) { p[i]=0; } for(int i=2;i<1000;i++) { if(!p[i]) { for(int j=2*i;j<=1000000;j+=i) { p[j]=1; } } } k=0; for(int i=2;i<=1000000;i++) { if(!p[i]) { ip[k++]=i; } } int t,n; cin>>t; int a1,a2; int tm,min; while(t--) { cin>>n; for(int i=1;i<=n;i++) { num[i]=1;//开始时将所有的灯标为1 } while(cin>>a1>>a2) { if(a1==0&&a2==0) { break; } if(a1>a2) { min=a2; } else { min=a1;//求出最小值 } for(int i=0;i<k;i++)//在K个素数内寻找 { if(ip[i]<min)//以a1 a2的最小的那个为临界值 { if(a1%ip[i]==0&&a2%ip[i]==0)//如果ip[i]的素数值能够被a1 a2同时整除 { tm=ip[i];//记录此值 for(int j=tm;j<=n;j+=tm)//寻找此值的倍数,他的倍数也将被标记 { if(num[j])//如果此灯是1则改为零 { num[j]=0; } else//如果是零则改为1 { num[j]=1; } } } } } } sum=0; for(int i=1;i<=n;i++) { sum=sum+num[i];//将所有为1的数加起来 } cout<<sum<<" "n-sum<<endl; } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
- ¥20 网站后台使用极速模式非常的卡
- ¥20 Keil uVision5创建project没反应
- ¥15 mmseqs内存报错
- ¥15 vika文档如何与obsidian同步
- ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
- ¥15 陆空双模式无人机飞控设置
- ¥15 sentaurus lithography
- ¥100 求抖音ck号 或者提ck教程
- ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)