poj 3696 欧拉函数

poj 3696

题意:

给出一个数字L,求出最短的888...8能被L整除,输出最短的长度。

限制:

1 <= L <= 2*10^9

思路:

设x为最小长度

888...8=(10^x-1)/9*8

由题意得:

(10^x-1)/9*8 % L=0

-> (10^x-1)*8 % (9L) = 0

-> (10^x-1) % (9L/gcd(L,8)) = 0

-> 10^x % (9L/gcd(L,8)) = 1

这个是一个离散对数的问题,第一个想到的是用拓展BSGS做,但超时了。

因为余数为1

可以想到欧拉定理:a^phi(m) % m = 1 , 在a与m互质的条件下。

回到这道题:

在10 与 9L/gcd(L,8) 不互质的条件下,无解

在10 与 9L/gcd(L,8) 互质的条件下

求出tmp=phi(9L/gcd(L,8)),然后O(sqrt(tmp))枚举tmp的因子,选出最小的符合条件的因子就行了。

时间: 2024-09-30 14:04:23

poj 3696 欧拉函数的相关文章

poj 3090 (欧拉函数,找规律)

poj 3090 (欧拉函数,找规律) 题目: 给出一个n*n的点阵,求从(0,0)出发斜率不相等的直线有多少条. 限制: 1 <= n <= 1000 思路: 先定义sum[i] sum[i] = 0, if(i == 1) sum[i] = sum[i-1] + phi[i], if(i >= 2) ans = sum[n] * 2 + 3 /*poj 3090 题目: 给出一个n*n的点阵,求从(0,0)出发斜率不相等的直线有多少条. 限制: 1 <= n <= 100

poj 2480 欧拉函数+积性函数+GCD

题目:http://poj.org/problem?id=2480 首先要会欧拉函数:先贴欧拉函数的模板,来源于吉林大学的模板: //欧拉函数PHI(n)表示的是比n小,并且与n互质的正整数的个数(包括1). unsigned euler(unsignedx) {// 就是公式 unsigned i, res=x; for(i = 2; i < (int)sqrt(x * 1.0) + 1; i++) if(x%i==0) { res = res / i * (i - 1); while(x %

POJ 2478 欧拉函数打表的运用

http://poj.org/problem?id=2478 此题只是用简单的欧拉函数求每一个数的互质数的值会超时,因为要求很多数据的欧拉函数值,所以选用欧拉函数打表法. PS:因为最后得到的结果会很大,所以结果数据类型不要用int,改为long long就没问题了 #include <iostream> #include <stdio.h> using namespace std; #define LL long long LL F[1000100]; int phi[10001

POJ 2478 欧拉函数(欧拉筛法) HDU 1576 逆元求法

相关逆元求法,我之前有写过,还有欧拉函数的求法,欧拉函数与逆元的关系  点击 POJ 2478 又是一个打表的题目,一眼看出结果就是前n个欧拉函数值的和. 这里直接计算欧拉函数值求和会超时,看见多组数据. 然后就是计算欧拉函数,打表就好了. #include <stdio.h> #include <string.h> #include <iostream> using namespace std; typedef long long LL; const int N =

POJ 3090 欧拉函数

求一个平面内可见的点,其实就是坐标互质即可,很容易看出来或者证明 所以求对应的欧拉函数即可 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int phi[1010]; int n; void calc(int x) { for (int i=2;i<=x;i++) phi[i]=0; phi[1]=1;

Farey Sequence POJ - 2478 (欧拉函数 前缀和)

Farey Sequence POJ - 2478 题目链接:https://vjudge.net/problem/POJ-2478 题目: 法理序列Fn是指对于任意整数n( n >= 2),由不可约的分数a/b(0 < a < b <= n),gcd(a,b) = 1升序排列构成的序列,最开始的几个如下 F2 = {1/2} F3 = {1/3, 1/2, 2/3} F4 = {1/4, 1/3, 1/2, 2/3, 3/4} F5 = {1/5, 1/4, 1/3, 2/5,

POJ 3090 (欧拉函数) Visible Lattice Points

题意: UVa 10820 这两个题是同一道题目,只是公式有点区别. 给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 对于点(x, y), 若g = gcd(x, y) > 1,则该点必被点(x/g, y/g)所挡住. 因此所见点除了(1, 0)和(0, 1)满足横纵坐标互素. 最终答案为,其中的+3对应(1, 1) (1, 0) (0, 1)三个点 1 #include <cstdio> 2 3 const int maxn = 1000; 4 int

[POJ 2407]Relatives(欧拉函数)

Description Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz. Input There are several

POJ 3090 Visible Lattice Points 欧拉函数

链接:http://poj.org/problem?id=3090 题意:在坐标系中,从横纵坐标 0 ≤ x, y ≤ N中的点中选择点,并且这些点与(0,0)的连点不经过其他的点. 思路:显而易见,x与y只有互质的情况下才会发生(0,0)与(x,y)交点不经过其他的点的情况,对于x,y等于N时,可以选择的点均为小于等于N并且与N互质的数,共Euler(N)个,并且不重叠.所以可以得到递推公式aa[i]=aa[i]+2*Euler(N). 代码: #include <iostream> #in