UVA 12493 Stars (尤拉函式--求1~n與n互質的個數)
大致題意:圓上有偶數n個點,每m個點連起來,最後可以把所有點串聯起來就合法。問有多少個m可以完成串聯,串聯後形狀相同的算重複
n <2^31
思路:可以寫個暴力程式,可以發現只要m與n互質,就可以完成串聯,所以用尤拉函式解決
證明:
設cnt為當第一次達到原點時連線了幾個點。
所以有 m*cnt = k*n
得到 cnt = k*n/m
顯然要第一次達到原點就是k逐漸增大使k*n/m變為整數的第一個k值, 且由題意必須使cnt = n , 所以m與n互質即可
所以m的種數就是 phi(n)
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstring> #include <cmath> #include <queue> #include <stack> #include <map> #include <set> #include <string> #include <vector> #include <cstdio> #include <ctime> #include <bitset> #include <algorithm> #define SZ(x) ((int)(x).size()) #define ALL(v) (v).begin(), (v).end() #define foreach(i, v) for (__typeof((v).begin()) i = (v).begin(); i != (v).end(); ++ i) #define reveach(i, v) for (__typeof((v).rbegin()) i = (v).rbegin(); i != (v).rend(); ++ i) #define REP(i,n) for ( int i=1; i<=int(n); i++ ) #define rep(i,n) for ( int i=0; i< int(n); i++ ) using namespace std; typedef long long ll; #define X first #define Y second typedef pair<int,int> pii; typedef pair<pii,pii> PII; template <class T> inline bool RD(T &ret) { char c; int sgn; if (c = getchar(), c == EOF) return 0; while (c != '-' && (c<'0' || c>'9')) c = getchar(); sgn = (c == '-') ? -1 : 1; ret = (c == '-') ? 0 : (c - '0'); while (c = getchar(), c >= '0'&&c <= '9') ret = ret * 10 + (c - '0'); ret *= sgn; return 1; } template <class T> inline void PT(T x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) PT(x / 10); putchar(x % 10 + '0'); } int euler(int n){ //返回euler(n) int ans = n; int num = n; for(ll i = 2; i*i <= num; i++){ if( num%i == 0){ ans = ans/i*(i-1); while( num%i == 0) num /= i; } } if(num > 1) ans = ans/num*(num-1); return ans; } int main(){ int n; while(~scanf("%d",&n)){ printf("%d\n",euler(n)/2); } }
相關推薦
UVA 12493 Stars (尤拉函式--求1~n與n互質的個數)
大致題意:圓上有偶數n個點,每m個點連起來,最後可以把所有點串聯起來就合法。問有多少個m可以完成串聯,串聯後形狀相同的算重複 n <2^31 思路:可以寫個暴力程式,可以發現只要m與n互質,就可以完成串聯,所以用尤拉函式解決 證明: 設cnt為當第一次達到原點時
容斥原理求1到n與k互質個數
參考部落格:傳送門 此處的k<=1e9、 #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #include<vecto
UVa 10299 :Relatives 尤拉函式
題目: Given n, a positive integer, how many positive integers less than n are relatively prime to n? T
尤拉函式求互質數個數
求解與n(1-n-1)互質的質因子的個數 解析: 定義:對於正整數n,φ(n)是小於或等於n的正整數中,與n互質的數的數目。 例如:φ(8)=4,因為1,3,5,7均和8互質。 性質:1.若p是質數,φ(p)= p-1. 2.若n是質數p的k次冪,
求1~n與x互質的數的個數(6個題、容斥原理)
HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的
求1~n中與m互質的數的個數(m>n) 附hdu1695題解(尤拉函式+容斥原理)
int calc(int n,int m) { //求1~n 與m互質的數的個數 int num=getFactors(m); //先將m分解質因數 int sum=0; //先求出不互質的個數,最後用n減去該數 for(int state=1;
51nod 1040 求1-n這n個數,同n的最大公約數的和(尤拉函式)
題目:給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15 思路:一個數與n的最大公約數肯定是n的因子中的一個,所以只需要列舉n的每一個因子x,然
一類尤拉函式相關的求和式推導
\(\\\) 寫在前面 因為最近做了不少和尤拉函式相關的求和問題,而這一類求和的推導有沒有涉及到反演和卷積,所以單獨寫一寫。 給出的題目順序與難度大致無關,是按照個人做題的順序安排的。 再次宣告尤拉函式的定義:\(\varphi(x)\) 表示 \([1,x]\) 裡的所有整數中,與 \(x\)
GCD - Extreme (II) UVA - 11426 尤拉函式_數學推導
Code: #include<cstdio> using namespace std; const int maxn=4000005; const int R=4000002; const int N=4000002; long long sumv
hdu1395 2^x mod n = 1(尤拉函式)
2^x mod n = 1 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20133  
poj1284 && caioj 1159 尤拉函式1:原根
這道題不知道這個定理很難做出來。 除非暴力找規律。 我原本找的時候出了問題 暴力找出的從13及以上的答案就有問題了 因為13的12次方會溢位 那麼該怎麼做? 快速冪派上用場。 把前幾個素數
UVA-11426 GCD-Extreme(II) 尤拉函式+推公式
感覺很考驗思維的一道題。。我太菜了...除了最樸素的暴力就想不出來別的了QAQ.. 主要就是以下三點: 1.g[n]=g[n-1]+b[n],b[n]表示1到n-1與n的gcd的和 2.b[n]=∑(a[i]*i) (0<i<n),a[i]表示1到n-1
算個尤拉函式給大家助助興(米勒拉賓(判斷素數)+Pollard_rho(求一個大數的因子 ))
這篇部落格講的很好: 題目描述 木南有一天學習了尤拉函式,知道了對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目。那麼他定義f(n)為有多少個小於等於n的數可以整除n。 例如f(4)=3。(可以被1,2,4整除)。 那麼你可以寫個程式計算一下f(n)嗎?
求N(10^14)以內與N互質的數的和(容斥原理,或者尤拉函式)
#include <iostream> #include <cstring> #include <algorithm> #include <cmath>
【HDU】5321 Beautiful Set【列舉k求貢獻,尤拉函式應用】
mycode: #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> using namespace
求一個數的質因子以及尤拉函式
求一個數的質因子 程式碼:#include<stdio.h> int main() { long long a[100],num,i,n; while(~scanf("%I64d",&n)) { num=0;
數論模板(1) 質數判斷、線性篩、樸素尤拉函式線性篩
1.素數的判斷 從去年退役之後,本人重回競賽界,開始新的人生,只是忘記的東西太多,一點點地複習吧 先來說質數的判斷 首先,一個數是質數的充分必要條件是,除了1和本身沒有其他因子,(順便說一下1也不是素數,其實1被認為既不是素數也不是合數)。因此最最樸素的演算法是
求數論求約數和 與 互質和演算法 (分解質因數與尤拉函式)
Description One day, Qz met an easy problem. But after a 5-hout-long contest in CSU, he became very tired and he wanted to call his girl
Farey Sequence——(篩法求尤拉函式)
傳送門 A - Farey Sequence Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d &
尤拉函式(提供1到N中與N互質的數)
當個板子放著,具體是看了這篇部落格:尤拉函式求法與應用 尤拉函式用希臘字母φ表示,φ(N)表示N的尤拉函式. 對φ(N)的值,我們可以通俗地理解為小於N且與N互質的數的個數(包含1). //直接求解尤拉函式 int euler(int n){ //返回euler(n