hdu5175 gcd 求约数

题意:求满足条件GCD(N,M) = N XOR M的M的个数

sol:和uva那题挺像的。若gcd(a,b)=a xor b=c,则b=a-c

暴力枚举N的所有约数K,令M=NxorK,再判断gcd(N,M)是不是等于K。

暴力枚举约数时传统方法是O(N)的,会完蛋

有个O(sqrt(N))的方法:

性质:若n%i==0,则有n%(n/i)=0

时间: 2024-08-24 19:27:51

hdu5175 gcd 求约数的相关文章

N个数GCD求解法

[N个数GCD求解法] 1.质因数分解法. 2.两两求解法. 3.更相减损法. 例题 4.Trick1. 5.Trick2. 6.Trick3.

高效率求约数的个数

高效率求约数的个数 求约数的个数方法有很多,你可以使用O(n)的方法来遍历看是否为约数,更可以使用复杂度的算法从1~来判断个数,但是在这里我们给出的是一种稍快于的方法,大概节省2/3左右的时间. 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1000) 接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000) 当N=0时输入结束. 输出: 可能有多组输入数据,对于每组输入数据, 输出N行,其中每一行对应上面

HDU 5211 筛法求约数

给出n个数a1,a2...an,定义函数 f[i]=j,(i<j),表示aj mod ai=0 的最小j,其中j大于i,如果不存在这样的数,则f[i]=0 求n个数所有f[]值的和 先用筛法o(nlogn)求出每个数的约数 然后每读入一个数x,先找出所有的约数,再看看之前有没有出现过这些约数. 这个回看的过程可以用一个数组维护. 维护watch[],watch[aj]=j 表示aj还没有找到函数值,如果aj是x的约数,那么说明aj的函数值为x的位置. #include<cstdio> #

(hdu 2.1.4)又见GCD(求最大公约数GCD的变化题)

题目: 又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2685 Accepted Submission(s): 1327   Problem Description 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. Input 第一行输入一个n,

hdu1576(扩展gcd求乘法逆元)

A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7509    Accepted Submission(s): 5969 Problem Description 要求(A/B)%9973,但由于A很大,我们只给出n(n=A%9973)(我们给定的A必能被B整除,且gcd(B,9973) = 1). Input 数据的第一行是一个T

SPOJ:NO GCD (求集合&amp;秒啊)

You are given N(1<=N<=100000) integers. Each integer is square free(meaning it has no divisor which is a square number except 1) and all the prime factors are less than 50. You have to find out the number of pairs are there such that their gcd is 1

[CodeForces-1036E] Covered Points 暴力 GCD 求交点

题意: 在二维平面上给出n条不共线的线段,问这些线段总共覆盖到了多少个整数点 解法: 用GCD可求得一条线段覆盖了多少整数点,然后暴力枚举线段,求交点,对于相应的 整数交点,结果-1即可 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cmath> 6 #include<vector> 7 #inc

数论考试题(b) 求约数的约数的最大个数

题意:求1~n范围里约数的约数的个数加起来最多的是哪个数 及其总数 题解: /* 对一个数质因数分解 首先要知道两个公式:约数的个数的公式,和约数的约数的个数的公式(详见题解) 然后发现:质因数分解后 小的次冥尽量大 会使答案更优 然后使次幂单调不升 dfs求r序列 */ #include<bits/stdc++.h> using namespace std; #define ll long long int pri[]={2,3,5,7,11,13,17,19,23,29,31,37,41,

线性筛--如何线性求约数个数

线性筛 我已经掌握埃氏筛了 为什么还要学线性筛??? 线性筛的时间复杂度是严格 \(O(N)\) 的, 而埃氏筛的复杂度是 $ O(N * log_{2}( log_{2}(N) ) $ 看上去并没有快多少 实际也是, 但在处理一些大数据时,差距就凸显出来了 算法思路 概述: 和埃氏筛类似的 线性筛是通过枚举到的当前数字乘以某个比该数的最小质因子还小的质数来筛的 (上面这句话有点长, 需要反复理解 暂时不能理解,也没关系,等下代码中我会详细讲的) 这样就可以保证每次几乎不会出现重筛的情况,大大减