1. 程式人生 > >hdu4235 Co-prime(求互質數的個數)

hdu4235 Co-prime(求互質數的個數)

//一般我們求1~n中與n互質的數的個數都用尤拉φ函式:φ(n)是所有小於n的正整數裡,和n互素的整數的個數。n是一個正整數。 尤拉證明了下面這個式子:如果n的標準素因子分解式是p1^a1*p2^a2*……*pm^am,其中眾pj(j=1,2,……,m)都是素數而且兩兩不等。則有 φ(n)=n(1-1/p1)(1-1/p2)……(1-1/pm) 但如果n比較大或者是求1~m中與n互質的數的個數等等問題,我們用容斥原理效率更高。
先對n分解質因數,分別記錄每個質因數,那麼所求區間內與某個質因數不互質的個數就是n / r(i),假設r(i)是r的某個質因子 ;當有很多個質因子時,可以用狀態壓縮解決,二進位制位上是1表示這個質因子被取進去了。
 如果有奇數個1則相加,反之則相減。

#include<stdio.h>

#include<stdlib.h> 
#include<math.h>
#define ll long long
int prime[100];
int m;
ll co_p(ll p)
{
  ll sum=0,i,tmp;
  int j,flag;
  for(i=1;i<(ll)(1<<m);i++){  //用二進位制1,0來表示第幾個素因子是否被用到,如m=3,三個因子是2,3,5,則i=3時二進位制是011,表示第2,3個因子被用到 
    tmp=1,flag=0; 
    for(j=0;j<m;j++)
      if(i&((ll)(1<<j))) //判斷第幾個因子目前被用到 
        flag++, tmp*=prime[j];
    if(flag&1)   sum+=p/tmp;   //容斥原理,奇加偶減 ,跟tmp不互質的個數 
    else         sum-=p/tmp; 
  }
  return p-sum; 

int main()          //容斥原理 
{
 ll n,a,b,i,num;
 int t,k=0;
 scanf("%d",&t);
 while(t--){  
   scanf("%I64d %I64d %I64d",&a,&b,&n);
   m=0; 
   for(i=2;i*i<=n;i++)         //注意此處是i*i<=n 
     if(n&&n%i==0){
       prime[m++]=i;           
       while(n&&n%i==0)
         n/=i;                 
     }                  
   if(n>1){                  
     prime[m++]=n; 
   } 
   num=co_p(b)-co_p(a-1); 
   printf("Case #%d: %I64d\n",++k,num);    
 }
 //system("pause");
 return 0;    
}

相關推薦

hdu4235 Co-prime(互質數個數)

//一般我們求1~n中與n互質的數的個數都用尤拉φ函式:φ(n)是所有小於n的正整數裡,和n互素的整數的個數。n是一個正整數。 尤拉證明了下面這個式子:如果n的標準素因子分解式是p1^a1*p2

尤拉函式互質數個數

求解與n(1-n-1)互質的質因子的個數 解析: 定義:對於正整數n,φ(n)是小於或等於n的正整數中,與n互質的數的數目。     例如:φ(8)=4,因為1,3,5,7均和8互質。 性質:1.若p是質數,φ(p)= p-1.    2.若n是質數p的k次冪,

(hdu step 2.1.3)Largest prime factor(個數的最大質因子的位置)

Everybody knows any number can be combined by the prime number.Now, your task is telling me what position of the largest prime factor.The position of prime

【容斥原理-區間內與n互質的數】HDOJ Co-prime 4135

Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N. Two integers are said to be co-

CO-PRIME(初探 莫比烏斯)NYOJ1066(經典)gcd(a,b)=1

put size 兩個 test hat ott == clas otto CO-PRIME 時間限制:1000 ms | 內存限制:65535 KB 難度:3 描寫敘述 This problem is so easy! Can you solve it

算法 - 個數組的最長遞減子序列(C++)

str log bst article subst else from return ear //************************************************************************************

基礎1--個數的最大質因數

pre spa pac com urn space align images 分享 基礎1--求一個數的最大質因數 一、心得 二、代碼及結果 1 #include <iostream> 2 using namespace std; 3 int fin

個數的二進制數中所含1的個數的代碼實現

article snippet 出現 pri data- count tdi main 代碼實現 #include<stdio.h> int numberOf1_solution1(int n)/*將一個正數以此向右移一位,與1做與運算。直到這個數為零

php 寫程序個數的最大值

定義函數 pyw max函數 https pst com amp 定義 http 最簡單的調用PHP自帶的max函數即可:echo max(1,2,3,4,5);如果要自定義函數的話:function test($a,$b,$c){ return $a > $b

hdu6055(正方形個數)

輸出 ostream mes clas stream fin set opened long 題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=6055 題意: 給出 n 組坐標 x, y, 輸出其中的正多邊形個數 . 其中

C++個數的最大值

eof sizeof ios int sig turn c++ a + b -a //不使用if,:?等推斷語句。求兩個數字中最大的那個數字。 #include<iostream> using namespace std; int main(

數學題 因子個數

給定 other statistic mark scanf logs down targe rip 小C的倍數問題 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others)

個數之間的隨機正整數

長度 -1 重復 pre script floor return turn random 求兩個數之間的隨機正整 數。並添到新數組,數組長度由自己指定。並且數組中不能有重復的值 function getRandomInt (min, max) { return Mat

【單調棧】個數組第一個比他小的數的位置

type 技術分享 bit esp alt log lap while play 【AC】 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int

1.交換兩值內容 2.不創建臨時變量交換兩只內容 3.個數中的最大值 4.講三個數由大到小輸出 5.個數最大公約數

www. 最大公約數 十個 following .com blank 臨時變量 lan follow 露x都對貝姨芽沽1才39賢http://www.facebolw.com/space/2104128 ZP鋪巢嗣3瀉HX7Dhttp://www.facebolw.com

個數的最大公約數

pri div temp 輾轉相除法 公約數 歐幾裏德算法 最大 ebo != #-*-coding:utf-8-*- ‘‘‘ 求兩個數的最大公約數 算法參考:https://zhidao.baidu.com/question/36550887.html by:rebor

java個數百分比,精確到指定位數

sta number ring light tin blog div clas imu // 獲取百分比,不帶小數點 private String getPercentage(String num, String total){ NumberFor

hdu4135 Co-prime【容斥原理】

for ott lines mod color tro ace co-prime scrip Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other

個數的因子個數

質因數分解 ++ 圖片 src image com pos 質因數 scanf 先將n質因數分解後,如n=x1^a*x2^b*x3^c 個數為 (a+1)*(b+1)*(c+1) poj 2992 #include<stdio.h>#include<st

個數的所有因子數

== sqrt color pre col num blog 因子 print def getNum(num): dict={}   #因子數都是以sqrt(num)為界對稱的,找出<=sqrt(num)這邊的,用num/i就同時獲得了另一半的因子數,從1開