GCD Guessing Game Gym - 100085G 猜数字 gcd

http://codeforces.com/gym/100085/attachments

因为那个数字是一个质数,这样的猜的次数是最多的,所以至少是质数次。

但是如果需要猜2、3,那么可以直接猜6,也能达到猜2和3的效果。

想要猜7、11,那么可以猜77,会产生gcd = 7的有7、49、77,gcd = 11的有11、77

所以相当于把1--n的质数分组,每组的乘积不能超过n,求最小的组数。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;

const int maxn = 1e6 + 20;
int prime[maxn], mu[maxn];//这个记得用int,他保存的是质数,可以不用开maxn那么大
bool check[maxn];
int total;
void initprime() {
    mu[1] = 1; //固定的
    for (int i = 2; i <= maxn - 20; i++) {
        if (!check[i]) { //是质数了
            prime[++total] = i; //只能这样记录,因为后面要用
            mu[i] = -1; //质因数分解个数为奇数
        }
        for (int j = 1; j <= total; j++) { //质数或者合数都进行的
            if (i * prime[j] > maxn - 20) break;
            check[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                mu[prime[j] * i] = 0;
                break;
            }
            mu[prime[j] * i] = -mu[i];
            //关键,使得它只被最小的质数筛去。例如i等于6的时候。
            //当时的质数只有2,3,5。6和2结合筛去了12,就break了
            //18留下等9的时候,9*2=18筛去
        }
    }
}
vector<int> vc;
bool vis[maxn];
void work() {
    int ans = 0;
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        if (prime[i] > n) break;
        vc.push_back(prime[i]);
    }
    for (int i = 0; i < vc.size(); ++i) {
        if (vis[i]) continue;
        int now = vc[i];
        for (int j = vc.size() - 1; j >= 0; --j) {
            if (vis[j]) continue;
            if (now * vc[j] <= n) {
                vis[j] = true;
                now *= vc[j];
            }
        }
        ans++;
    }
    printf("%d\n", ans);
}

int main() {
#ifdef local
    freopen("data.txt", "r", stdin);
//    freopen("data.txt", "w", stdout);
#endif
    freopen("gcd.in", "r", stdin);
    freopen("gcd.out", "w", stdout);
    initprime();
    work();
    return 0;
}

时间: 2024-08-05 07:03:55

GCD Guessing Game Gym - 100085G 猜数字 gcd的相关文章

UVA 1521 - GCD Guessing Game(数论+贪心)

UVA 1521 - GCD Guessing Game 题目链接 题意:一个数字x在1-n之间,现在猜数字,每次猜一个数字a,告知gcd(x, a)的答案,问最坏情况下需要猜几次 思路:在素数上考虑,猜一组素数的乘积的数字,就可以把这些素数组成的数字都猜出来,答案就是组数,这样问题就是如何分组使得组数最小,每次取最后一个,尽量和前面小的合并,就能使得组数最小 代码: #include <cstdio> #include <cstring> #include <algorit

uva 1521 - GCD Guessing Game(贪心)

题目链接:uva 1521 - GCD Guessing Game 题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x. 解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

2632: [neerc2011]Gcd guessing game

2632: [neerc2011]Gcd guessing game Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 144  Solved: 84[Submit][Status][Discuss] Description 给定一个数n ,有一个数x , ( 1<=x<=n ) 每次你可以猜在[1,n]中的数,假设是y,如果x==y,游戏结束,如果没猜中,则告诉你gcd(x,y),然后继续猜,直到猜中为止. 现在问给定n的情况下,最坏情况下最少要

Java 初学 第一弹--编译并运行书上的简单程序(猜数字小游戏)

(博主原创) 首先说明一下,博主是大一上学期结束寒假时自己看的Java,然后我看的是Head First Java的中文版,因为大一学了c,所以里面的一些基本思想还是了解的,在看这本书时就浏览了一下(就是那种光看没有自己动手去敲代码的),然后看到书上的一个猜数字小游戏,就想手动敲一下,熟悉熟悉Java的语法,但是真正去做时,发现比看起来要困难一些. 首先是Java在建立一个源码文件之前要先建一个package,然后我用的Eclipse写的Java(感觉和pycharm风格差不多),再新建一个文件

python之猜数字

使用python实现当猜数字,当数字大了,提示数字大,数字小了提示数字小,如果3次猜错,询问是否继续猜 使用while循环来实现代码如下 num=56count=0while count<=2: guess=input('enter your guessing number:') if guess.isdigit(): guess=int(guess) if guess==num: print('congratulations!') break elif guess>=num: print('

20170913自制猜数字游戏

/* 猜数字:系统随机生成一个四位数,请根据下列判断猜出来 A:数值正确,位置正确 B:数值正确,位置不正确 C:数值不正确 */ #include<stdio.h> #include<time.h> #include<stdlib.h> #pragma warning (disable:4996) #define pUCharHead unsigned char * //以数组形式返回n个无重复的随机数,范围可指定[min,max] pUCharHead GenNoR

JavaScript一个猜数字游戏

效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载入的时候就开始一个新的游戏 window.onpopstate = popState; //处理历史记录相关事件 var state,ui; //全局变量,在newgame()方法中会对其初始化 function newgame( playagin ){ //开始一个新的猜数字游戏 //初始化一个包含需要的文

函数调用_猜数字和简易计算器

package app1; import java.util.*; public class TestFunction{     public static void main(String[] args){         Scanner sc=new Scanner(System.in);         System.out.print("请选择一项应用:\n1.猜数字\n2.简易计算器");         int n=sc.nextInt();         switch(

【bzoj入门】3189 猜数字(数学,搜索)

Description 味味最近在玩猜数字的游戏,现在她也希望你来玩一下这个游戏.猜数字游戏的规则是这样的,告诉你一个正整数 n(2<=n<=11),然后味味心中会想一个 n 个数字组成的数字串 (数字串最前面若干位可能是 0).味味会随意排列 n 位数上的数字,这样可能产生 n!个 n 位数.(n!=1×2×3×4×5×......×n,n!念作"n 阶乘").比如味味想了一个三位数 abc,那么一共会产生六个三位数,分别为 abc,acb,bac,bca,cab,cba