Codeforces Round #109 (Div. 2) D. Colliders 数学
来源:互联网 发布:通天西游坐骑进阶数据 编辑:程序博客网 时间:2024/06/01 07:47
一直觉得codeforces上的题解法都很新奇,这个也不例外,说说题意,
最大10^5的数,进行10^5次操作,每一次进行加入或者删除一个数,加入时:只有与已加入的数互素才能加入,不能加入的,输出原因(与某个不互素,或者,已经加入)。删除时:输出删除成功,或者尚未加入。
这个题看起来不简单,经过分析之后,我发现,对于10^5这么大的数,只能最多有7个不同的素数的幂的积的形式,要使互素,也就是说,没有共同的素数因子,按照这个思路,我们对每一个数的素数因子进行标记,插入的时候,就可以查询插入的这个数的素数因子有没有出现
这个思路的时间复杂度是O(10^5*7),这个复杂度是可以解决的。
但是,其中有一个需要输出与第几个互素,这个也需要标记。ok,代码见下面
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;#define N 1000010int prime[N];bool isPrime[N+1];int size;void getPrime() { size = 0; memset(isPrime,true,sizeof(isPrime)); int i; for(i=2; i<=N/2; i++) { if(isPrime[i]) //i是素数 for(int j=i+i; j<=N; j+=i) isPrime[j]=0; } for(i=2; i<=N; i++) { if(isPrime[i]) prime[size++]=i; }}bool active[100010];int data[100010][10];int count[100010];//计数出现这个素数的jint main(){ //cout << 2*3*5*7*11*13*17; getPrime(); for(int i = 0;i < size;i++) { for(int j = prime[i];j < 100010;j += prime[i]) data[j][ ++data[j][0] ] = prime[i]; } int n,m; scanf("%d%d",&n,&m); memset(active,0,sizeof(active)); memset(count,0,sizeof(count)); char c[2];int t; for(int i = 0;i < m;i++) { scanf("%s%d",c,&t); if(c[0] == '+') { //1 success 2 already on 3冲突 if(active[t]) printf("Already on\n"); else { bool b = 0; for(int j = 1;j <= data[t][0];j++) if(count[ data[t][j] ]) { printf("Conflict with %d\n",count[ data[t][j] ]); b = 1;break; } if(!b) { for(int j = 1;j <= data[t][0];j++) count[ data[t][j] ] = t; printf("Success\n"); active[t] = 1; } } }else //-- { if(!active[t]) printf("Already off\n"); else { for(int j = 1;j <= data[t][0];j++) count[ data[t][j] ] = 0; printf("Success\n"); active[t] = 0; } } } return 0;}
- Codeforces Round #109 (Div. 2) D. Colliders 数学
- Codeforces Round #360 (Div. 2) D. Remainders Game(数学)
- Codeforces Round #364 (Div. 2) D 数学推导
- Codeforces Round #364 (Div. 2) D 数学/公式
- Codeforces 155 D. Colliders
- Codeforces Round #419 (Div. 2) (Codeforces 815B) D. Karen and Test 组合数学
- Codeforces Round #228 Div.1 D 数位dp+数学
- Codeforces Round #224 (Div. 2)(数学、dfs)
- Codeforces Round #282 (Div. 2) B.(数学)
- Codeforces Round #384 (Div. 2)(数学)
- Codeforces Round #146 (Div. 2) D. Let's Play Osu! comb数平方和的数学期望
- Codeforces Round #253 (Div. 2) D. Andrey and Problem (贪心+数学概率)
- Codeforces Round #177 (Div. 2)---D. Polo the Penguin and Houses (组合数学+暴力)
- Codeforces Round #307 (Div. 2) D. GukiZ and Binary Operations(数学)
- Codeforces Round #289 (Div. 2, ACM ICPC Rules) D. Restoring Numbers 构造 数学
- Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学+预处理
- Codeforces Round #332 (Div. 2)D. Spongebob and Squares(数学方程,暴力)
- Codeforces Round #332 (Div. 2) 599D Spongebob and Squares(数学)
- 大数阶乘问题的c++实现
- Ogre的节点SceneNode(Node)
- C++ Psapi.h头文件
- FFF Warm Up Contest 2 - ZOJ 2012 February [iSea]
- 嵌入式操作系统内核原理和开发(中断)
- Codeforces Round #109 (Div. 2) D. Colliders 数学
- WSAEventselect模型中各网络事件触发机制
- Sicily 4832. Paper Route
- 有关素数的知识
- java的web.xml中<url-pattern>配置
- Skyline 6成果展示
- Using Bootchart on Android
- VS2010下使用Vim
- WSAEventSelect编程模型实现