UVa 11064 - Number Theory

题目:求给顶一个数n,的所有的1 ≤ m ≤ n的m,使得gcd(m,n)≠ 1 且 gcd(m,n)≠ m。

分析:数论,素数筛法,欧拉函数。

设pi为n的第i个素数因,k1为第i个素数因子的个数,则有:

1 ≤ m ≤ n,gcd(m,n)= 1 的m的个数为欧拉函数;

欧拉函数:φ(n)= n *(1 - 1/p1)*(1 - 1/p2)*(1 - 1/p3)*…*(1 - 1/pt);

1 ≤ m ≤ n,gcd(m,n)= m 的m的个数为n的所有因数的个数;

因数个数:f(n)= (k1+1)*(k2+1)*...*(kt+1);

这里利用筛法打表计算出150000内的素数,因为数据范围是20000000000内的,

所以,不能被前150000内的素数整除的数,也一定是素数,并且每个数n中最多有一个;

计算输出 n -  φ(n)- f(n)+ 1 即可{ gcd(1,n)计算了两次 }。

说明:UVa10299。

#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;  

int fac[32],num[32];
int prim[150000];
int used[150000];  

int main()
{
    for (int i = 0 ; i < 150000 ; ++ i)
        used[i] = 0;
    int save = 0;
    for (int i = 2 ; i < 150000 ; ++ i)
        if (!used[i]) {
            prim[save ++] = i;
            for (int j = 2*i ; j < 150000 ; j += i)
                used[j] = 1;
        }  

    int n;
    while (cin >> n && n) {
        int count = 0,base = 0,m = n;
        while (n > 1 && base < save) {
            if (n%prim[base] == 0) {
                fac[count] = prim[base];
                num[count] = 0;
                while (n%prim[base] == 0) {
                    n /= prim[base];
                    num[count] ++;
				}
				count ++;
            }
            base ++;
        }
        if (n > 1) {
			fac[count] = n;
			num[count] = 1;
			count ++;
		}

        long long ans = m;
        for (int i = 0 ; i < count ; ++ i)
            ans = ans/fac[i]*(fac[i]-1);

        //gcd(m,n) = m
        int s = 1;
        for (int i = 0 ; i < count ; ++ i)
        	s = s*(num[i]+1);

        cout << m-ans-s+1 << endl;
    }
    return 0;
}

时间: 2024-11-07 12:50:15

UVa 11064 - Number Theory的相关文章

UVa 11371 - Number Theory for Newbies

題目:給你一個數字n,將裡面每位的數重新組合形成a,b,使得a-b最大且是9的倍數. 分析:數論.題目要求a,b和n的位數相同,不能有前導0. 定理1:交換一個數字中的某兩個位的數,形成的新數組和原數字之差是9的倍數: 證明1:設數字為abc..i..j...xwz,其中每个字母代表一个位,对应值可以相同, 那么随意交换两位i,j得到的新数字为abc..j..i..xwz,做差为9..90..0 *(i-j), 所以一定是9的倍数,得证. 通過上面定理可以繼續證明,任意交換任意位數字形成的新數字

hdu-2685I won&#39;t tell you this is about number theory(数论)

题目链接: I won't tell you this is about number theory Problem Description To think of a beautiful problem description is so hard for me that let's just drop them off. :)Given four integers a,m,n,k,and S = gcd(a^m-1,a^n-1)%k,calculate the S. Input The fi

UVA 1558 - Number Game(博弈dp)

UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次可以选一个数字,然后它的倍数,还有其他已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp记忆化去求解,要输出方案就枚举第一步即可,状态转移过程中,选中一个数字,相应的变化写成一个函数,然后就是普通的博弈问题了,必胜态之后必有必败态,必败态之后全是必胜态 代码: #include <stdio.h> #include <string.h> const int N = 105

Acdream 1114 Number theory 莫比乌斯反演

http://acdream.info/problem?pid=1114 题目大意,给你一个序列a,求出这个序列中互质数的有多少对.其中所有的整数的都小于等于222222. f(d) 为 gcd 恰好为 d 的数的对数, F(d) 为 gcd 为 d 的倍数的对数, μ(d) 表示莫比乌斯函数 F(d) = ∑ f(n) 其中( n % d == 0 ) 莫比乌斯反演一下就可以得到, f(d) = ∑ μ(n / d) * F(n) 其中( n % d == 0) 所以我们最后所要的答案就是 f

uva 10706 Number Sequence(找规律)

uva 10706 Number Sequence A single positive integer iis given. Write a program to find the digit located in the position iin the sequence of number groups S1S2-Sk. Each group Skconsists of a sequence of positive integer numbers ranging from 1 to k, w

2013年北京师范大学新生程序设计竞赛网络赛--D. Number theory(模拟取余)

D. Number theory Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 34055 Font Size:  +   - 数学不仅是简单而且是美的.数学很有趣,但是数学中也有很多难题,比如哥德巴赫猜想.各种欧拉定理.拉格朗日中值定理.费马定理等.今天小若遇

UVA 11885 - Number of Battlefields(斐波那契)

11885 - Number of Battlefields 题意:给周长,求能围成的战场数目,不包括矩形. 思路:具体的递推没递推出来,但是看了网上一个规律,如果包括矩形的答案应该是斐波那契数列(但是奇数情况为0),然后减去矩形数目就是答案,矩形数目为n / 2 - 1,用矩阵快速幂就能求了. 具体的递推过程哪位大神能指点下... 代码: #include <stdio.h> #include <string.h> const long long MOD = 987654321;

hdu 2685 I won&#39;t tell you this is about number theory

#include<stdio.h>#include<string.h>#define LL __int64 LL mult_mod(LL a,LL b,LL c){    a%=c;    b%=c;    LL ret=0;    while(b)    {        if(b&1){ret+=a;ret%=c;}        a<<=1;        if(a>=c)a%=c;        b>>=1;    }    retur

uva 11885 - Number of Battlefields(矩阵快速幂)

题目连接:uva 11885 - Number of Battlefields 题目大意:给出周长p,问多少种形状的周长为p的,并且该图形的最小包围矩阵的周长也是p,不包括矩形. 解题思路:矩阵快速幂,如果包含矩形的话,对应的则是斐波那契数列的偶数项,所以对应减去矩形的个数即可. #include <cstdio> #include <cstring> using namespace std; typedef long long ll; const ll MOD = 9876543