1. 程式人生 > >UVA 12493 Stars (尤拉函式--求1~n與n互質的個數)

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~nn個數

大致題意:圓上有偶數n個點,每m個點連起來,最後可以把所有點串聯起來就合法。問有多少個m可以完成串聯,串聯後形狀相同的算重複 n <2^31 思路:可以寫個暴力程式,可以發現只要m與n互質,就可以完成串聯,所以用尤拉函式解決 證明: 設cnt為當第一次達到原點時

容斥原理1nk個數

參考部落格:傳送門 此處的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~nx的數的個數(6個題、容斥原理

HDU 4135、POJ 2773、HDU 1695、HDU 2841、ZOJ 2836、HDU 1796 HDU 4135 Co-prime 題意: 求[l,r]與x互質的數的

1~nm的數的個數(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-nn個數,同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 &

函式(提供1NN的數

當個板子放著,具體是看了這篇部落格:尤拉函式求法與應用 尤拉函式用希臘字母φ表示,φ(N)表示N的尤拉函式. 對φ(N)的值,我們可以通俗地理解為小於N且與N互質的數的個數(包含1). //直接求解尤拉函式 int euler(int n){ //返回euler(n