poj2480(利用歐拉函數的積性求解)

題目鏈接:??http://poj.org/problem?id=2480

題意:∑gcd(i, N) 1<=i <=N,就這個公式,給你一個n,讓你求sum=gcd(1,n)+gcd(2,n)+gcd(3,n)+…………gcd(n-1,n)+gcd(n,n),(1<=n<2^31)是多少?

放心吧!!!暴力肯定是做不出來的,如果你數論只會gcd(和我一樣),那還是學點東西再來挑戰這個題吧!

?

?這個題需要用到歐拉函數的知識……

歐拉函數的定義:對正整數n,歐拉函數是小于n的正整數中與n互質的數的數目(我們定義φ(1)=1

歐拉函數的的通式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)……*(1-1/ps)(p1,p2,p3,……ps均是n的質因子)

歐拉函數有這么幾個比較重要的性質:

性質1:如果n是質數p的k次冪,那么φ(n)=p^k-1*(p-1)

性質2:歐拉函數是積性函數——若m,n互質,φ(mn)=φ(n)*φ(m),積性函數和完全積性函數有區別,有興趣可以自己百度一下

性質3:當n為奇數的時候,φ(2n)=φ(n),這一點是由性質2推出來的,因為2必定和所有的奇數都是互質的,所以而φ(2)=1。所以得出這個結果

性質4:n的所有質因子之和等于φ(n)*n/2(這不算性質,只能算延伸)。

?

好了,大體介紹完了歐拉函數,我們可以開始來看看這個題怎么做了。

首先要知道gcd(i,n)是積性函數(當n固定時),也就是說gcd(i*j,n)=gcd(i,n)*gcd(j,n)(這里還有一個限制條件,就是i,j互質,所以gcd并非完全積性函數)

一開始我不是利用積性函數的性質做的,但是也用到了歐拉函數,因為一眼就和歐拉函數有關一下就手撕了,相當于半暴力吧,344ms,好丟人,這里也說下是怎么做的。

我們枚舉gcd(i,n)的所有情況即n的所有因子都有可能是他和其他數的最大公因數。我們假設M是n與i的最大公因數,那么所有與i互質且小于i的數與M的乘積我們設這個數為j,與n的最大公因數都為M,即gcd(j,n)=M,.這里所有與i互質且小于i的數也就是i的歐拉函數φ(i)而i=n/M。

但是我們直接1-n去枚舉n的所有因子設為M,來枚舉最大公約數的所有情況答案需要n的復雜度,在2^31次方的情況下是會超時的,所以我們采用折半枚舉,具體看代碼吧

//Author: xiaowuga
#include<iostream>
#include<cmath>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=1000;
using namespace std;
typedef long long LL;
LL euler(LL n){LL res=n;for(LL i=2;i*i<=n;i++){if(n%i==0){res=res/i*(i-1);while(n%i==0) n/=i;}}if(n>1)  res=res/n*(n-1);return res;
}
int main(){LL n;while(scanf("%lld",&n)!=EOF){LL ans=0;for(LL i=1;i*i<=n;i++){if(n%i==0){ans+=euler(n/i)*i;if(i*i<n) ans+=euler(i)*(n/i);}}printf("%lld\n",ans);}return 0;
}

?

?

?

好了現在我們需要來學習真正的姿勢了,我也是剛學的,利用gcd是積性函數的性質,根據前文說的,我們有這樣的結論:n>1時 n=p1^a1*p2^a2*...*ps^as,p為n的質因子,那么f(n)是積性函數的充要條件是f(1)=1,及f(n) = f(p1^a1)*f(p2^a2)*...f(pr^ar),所以只要求f(pi^ai)就好。現在來看具體做法。

f(pi^ai) = ?Φ(pi^ai)+pi*Φ(pi^(ai-1))+pi^2*Φ(pi^(ai-2))+...+pi^(ai-1)* Φ(pi)+ pi^ai *Φ(1)

根據性質1,我們可以做出如下化簡

f(pi^ai)=[pi^(ai-1)*(pi-1) ] + ?[pi*pi^(ai-2)*(pi-1)] ?+ ?[pi^2*pi^(ai-3)*(pi-1)] ?+ ?[pi^3*pi^(ai-4)*(pi-1)]....[pi^(ai-1)*pi^(ai-ai)*(pi-1)]+pi^ai ??①

然后對①提取公因子(pi-1)

f(pi^ai)=(pi-1){[pi^(ai-1) ] + ?[pi*pi^(ai-2)] ?+ ?[pi^2*pi^(ai-3)] ?+ ?[pi^3*pi^(ai-4)]....[pi^(ai-1)*pi^(ai-ai)]+[pi^ai/(pi-1)]} ?

緊接著我們發現出了最后一項每個[]每個方括號內乘積都等于pi^(ai-1),所以對②提取公因子pi^(ai-1)

f(pi^ai)=(pi-1)*pi^(ai-1)*{ai+[pi/(pi-1)]}?

然后把(pi-1)/pi放進括號里得

f(pi^ai)=pi^(ai)*{1+ai*(pi-1)/pi}?

這個?是單個f(pi^ai)的公式,我們提取所有的pi^(ai)相乘實際上就是n了,所以我們可以得到f(n)的公式:f(n)=n*∏(1+ai*(pi-1)/pi

然后我們看代碼吧!

//Author: xiaowuga
#include<iostream>
#include<cmath>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=1000; 
using namespace std;
typedef long long LL;
int main() {ios::sync_with_stdio(false);cin.tie(0);int n;while(cin>>n){LL i,sqr,p,a,ans;ans=n;sqr=floor(sqrt(1.0*n));for(int i=2;i<=sqr;i++){if(n%i==0){a=0;p=i;while(n%p==0){a++;n/=p;}ans=ans+ans*a*(p-1)/p;}}if(n!=1) ans=ans+ans*(n-1)/n;cout<<ans<<endl;}        return 0;
}

?

轉載于:https://www.cnblogs.com/xiaowuga/p/7161513.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/252324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252324.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

跨域問題

一、為什么會有跨域問題&#xff1f; 是因為瀏覽器的同源策略是對ajax請求進行阻攔了&#xff0c;但是不是所有的請求都給做跨域&#xff0c;像是一般的href屬性&#xff0c;a標簽什么的都不攔截。 二、解決跨域問題的兩種方式 JSONPCORS 三、JSONP 先簡單來說一下JSONP&#x…

PAT A1052

這個需要注意的是相關的string轉整數或者double的函數&#xff1b;詳見這個鏈接blog #include <iostream> #include <string> using namespace std; bool isPrime(int n) {if (n 0 || n 1) return false;for (int i 2; i * i < n; i)if (n % i 0) return fa…

php審計學習:xdcms2.0.8注入

注入點Fields: 注冊頁面會引用如下方法: $fields 變量是從 $fields$_POST[fields]; 這里獲取&#xff0c; 在代碼里沒有過濾。 打印 fields 數據查看: 從代碼上看 $field_sql.",{$k}{$f_value}"; 最終會變成: ,truename111111,email12345 因為 $field_sql 最終會引入…

windows下安裝python和Python-opencv

背景&#xff1a;目前基于python的圖像處理和機器視覺的研究還挺多&#xff0c;最近不是在研究目標檢測和目標跟蹤的算法&#xff0c;由于檢測和跟蹤的環境比較簡單所以從不帶學習的跟蹤方法&#xff0c;在搜索資料時搜到這個網站&#xff0c;是對opencv中的目標跟蹤算法的一個…

捋一捋js面向對象的繼承問題

說到面向對象這個破玩意&#xff0c;曾經一度我都處于很懵逼的狀態&#xff0c;那么面向對象究竟是什么呢&#xff1f;其實說白了&#xff0c;所謂面向對象&#xff0c;就是基于類這個概念&#xff0c;來實現封裝、繼承和多態的一種編程思想罷了。今天我們就來說一下這其中繼承…

java8簡單入門

1、介紹 本片文章會從一下幾個知識點進行介紹&#xff1a; 函數式接口 FunctionalInterfaceLambda 表達式函數引用 Function ReferenceStream看了幾篇關于 java8 入門的例子&#xff0c;其中引入了許多令人期待已久的特性&#xff08;雖然我沒有過這樣的體會&#xff09;&#…

玩轉帶外觸發的單目相機之一

背景&#xff1a;去年開始研究vins,但是只是用了普通的相機&#xff0c;然后將IMU和相機粘在一起&#xff0c;然后就是聯合標定相機和IMU。VINS使用的相機是帶有外觸發的&#xff0c;還進行了相機和IMU的硬件時間同步。當時我特別想買個帶外觸發的相機&#xff0c;一直沒找到資…

基于django的視頻點播網站開發-step11-后臺用戶管理功能...

用戶管理功能&#xff0c;包含用戶添加、列表展示、編輯、刪除四大功能。下面我們一一揭曉。 用戶添加 我們先實現用戶添加功能&#xff0c;我們現在urls.py下添加相關的路由 path(user_add/, views.UserAddView.as_view(), nameuser_add), path(user_list/, views.UserListVie…

BZOJ 1070 拆點 費用流

1070: [SCOI2007]修車 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 5860 Solved: 2487[Submit][Status][Discuss]Description 同一時刻有N位車主帶著他們的愛車來到了汽車維修中心。維修中心共有M位技術人員&#xff0c;不同的技術人員對不同 的車進行維修所用的時間是不…

分布式之數據庫和緩存雙寫一致性方案解析

先做一個說明&#xff0c;從理論上來說&#xff0c;給緩存設置過期時間&#xff0c;是保證最終一致性的解決方案。這種方案下&#xff0c;我們可以對存入緩存的數據設置過期時間&#xff0c;所有的寫操作以數據庫為準&#xff0c;對緩存操作只是盡最大努力即可。也就是說如果數…

使用python從csv文件中讀入兩列擬合直線

背景&#xff1a;要判斷跟蹤算法在控制目標物走直線的情況下跟蹤的軌跡是否為直線&#xff0c;我保存下來跟蹤算法跟蹤到的目標的中心點在圖像上的像素位置&#xff0c;然后擬合出穿過這些點的直線&#xff0c;然后計算這些點距離直線的平均距離來判斷跟蹤的精度。&#xff08;…

window document

1 打開一個新窗口 var newDocwindow.open("text/html","replace");var txt"<html><body>Learning about the DOM is FUN!</body></html>";newDoc.document.write(txt);newDoc.close(); //該方法將關閉 open() 方法打開…

‘(‘:illegal token on right side of ‘::‘

背景&#xff1a;想整理升級一下代碼&#xff0c;添加了兩個類&#xff0c;再一編譯代碼&#xff0c;出現了好多這樣的錯誤提示“(:illegal token on right side of ::”&#xff0c;我很納悶這是啥問題&#xff0c;我就使用“注釋法”來定位出錯的位置&#xff0c;我發現把所有…

mysql-數據庫操作

doc界面操作mysql:<br/> 以phpstudy為例 登錄數據庫&#xff1a;進入phpstudy/mysql/bin下&#xff0c;mysql -u用戶名 -p密碼 選擇數據庫&#xff1a;use 數據庫名; 設置編碼格式&#xff1a;set names gbk; 查看表結構或字段信息&#xff1a;desc 表名; 建立數據庫&…

虹軟免費人臉識別SDK注冊指南

2019獨角獸企業重金招聘Python工程師標準>>> 成為開發者三步完成賬號的基本注冊與認證&#xff1a; STEP1:點擊注冊虹軟AI開放平臺右上角注冊選項&#xff0c;完成注冊流程。 STEP2:首次使用&#xff0c;登錄后進入開發者中心&#xff0c;點擊賬號管理完成企業或者個…

Mybatis使用statementType=STATEMENT實現動態傳入表名或字段名

mybatis中使用statementType"STATEMENT"實現動態傳入字段名時一直報語句錯誤&#xff0c;但實際上語句并沒有毛病&#xff0c;爬了一天坑才找到問題&#xff0c;記錄一下。 整條語句中里所有傳入的值都要使用${xxx},不能使用#{xxx}。 <select id"listMap&quo…

C++中的類加多線程代碼修煉

背景&#xff1a;現在在做一個目標跟蹤的項目&#xff0c;需要實時的從工業相機中獲取圖像&#xff0c;然后再跟蹤圖像上的目標物&#xff0c;由于起初為了測試跟蹤算法&#xff0c;就把“從相機獲取圖像”和“跟蹤處理”都放在了主線程中&#xff0c;在實際測試時&#xff0c;…

Activity Monitor 閃退 無法進入睡眠

Activity Monitor 閃退 & 無法進入睡眠 情況描述 黑蘋果?主機突然無法進入睡眠。 考慮到可能是后臺程序阻礙了系統正常進入睡眠&#xff0c; 于是想要通過Activity Monitor查看系統的活動情況&#xff0c;然而&#xff0c;Activity Monitor閃退。 重新開機&#xff0c;快速…

hbase中清空整張表的數據

hbase(main):005:0> truncate fr:test Truncating FaceBase table (it may take a while):- Disabling table...- Dropping table...- Creating table...0 row(s) in 14.4220 seconds truncate是disable、drop、create三個動作的自動化集成。轉載于:https://www.cnblogs.com…

hibernate樹

1. 樹實現通過pid進行指向上一層來實現&#xff0c;實體類代碼如下 package com.test.model;import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.per…