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

100085G GCD Guessing Game

时间:2018-08-02 13:51:11      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:codeforce   tar   freopen   c++   ORC   形式   while   一个   scan   

传送门

题目大意

给定一个数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

标签:codeforce   tar   freopen   c++   ORC   形式   while   一个   scan   

原文地址:https://www.cnblogs.com/yzxverygood/p/9406556.html

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