100085G GCD Guessing Game
Posted yzxverygood
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100085G GCD Guessing Game相关的知识,希望对你有一定的参考价值。
题目大意
给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x。
分析
这个题应该可以算是贪心,但是没人知道这样为啥是对的(雾),我们现在来感性认识一下,我们知道对于任意一个数都可以写p1e1p2e2 ... 的形式,所以我们在每一次询问都可以确定有些p是否存在,如果存在我们在来确定它对应的e,这样只需要两次,而我们感性思考可以猜出没猜到一个p并确认一个e用去两次却可以直接否定很多其它的p,所以猜的次数一定小于等于确认所有p的次数,所以便可以按照下面的代码进行求解。
代码
#include<bits/stdc++.h>
using namespace std;
int dq[11000],L=1,R=0;
inline bool is(int x){
int i;
for(i=2;i*i<=x;i++)
if(x%i==0)return 0;
return 1;
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
int n,i,ans=0;
scanf("%d",&n);
for(i=2;i<=n;i++)
if(is(i))
dq[++R]=i;
while(L<=R){
while(dq[L]*dq[R]<=n){
L++;
dq[R]*=dq[L];
}
R--;
ans++;
}
cout<<ans<<endl;
return 0;
}
以上是关于100085G GCD Guessing Game的主要内容,如果未能解决你的问题,请参考以下文章
2632: [neerc2011]Gcd guessing game
CF 1780-D. Bit Guessing Game_Codeforces Round #846 (Div. 2) D