[ NOI 2002 ] Robot
\(\\\)
Description
\(\\\)
Solution
垃圾語文題毀我青春
這題其實就是重定義了倆函數(shù)....
首先 \(\varphi(1)=0\) 。
然后 \(2\) 在計算 \(\mu\) 的時候不算做質因子,含 \(2\) 的數(shù) \(\mu\) 值 \(=0\) 。
求 \(m\) 的所有因數(shù)中 , \(\mu=1,-1,0\) 的 \(\varphi\) 值之和。
\(\\\)
先考慮 \(\mu=1,-1\) 的答案。
根據(jù) \(\mu\) 的定義,此時所有所求的數(shù)字都滿足,分解質因數(shù)每一個質因數(shù)的質數(shù)至多為 \(1\) 。
然后 僅對于這些數(shù) 歐拉函數(shù)就有了一個新的計算公式:
\[ \varphi(n)=n\times {\frac{p_1-1}{p_1}}\times {\frac{p_2-1}{p_2}}\times ...\times {\frac{p_m-1}{p_m}}=(p_1-1)\times (p_2-1)\times ...\times (p_3-1) \]
發(fā)現(xiàn)這是一個質數(shù)集合選哪些的問題。
注意到每次多選一個質數(shù),所有的數(shù)字答案都乘上了相同的數(shù),所以可以直接求答案。
用一種類似動規(guī)的寫法,依次考慮每一個位置選或不選。
記\(ans_1\)表示選奇數(shù)個質因子,\(ans_2\) 表示選偶數(shù)個質因子的答案。
\[ ans_1+=ans_2\times (p_i-1),ans_2+=ans_1\times (p_i-1) \]
可以思考一下加號連接的含義。
\(\\\)
然后就只需要解決 \(\mu=0\) 的部分了。
關于歐拉函數(shù)其實有一個等式
\[ \sum_{d|m}\varphi(d)=m \]
然后問題解決,答案就是 \(m-ans_1-ans_2-1\),之所以多減掉一個 \(1\) 是因為 \(\varphi(1)=0\) 。
\(\\\)
Code
#include<cmath> #include<cstdio> #include<cctype> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define mod 10000 #define R register #define gc getchar using namespace std;inline int rd(){int x=0; bool f=0; char c=gc();while(!isdigit(c)){if(c=='-')f=1;c=gc();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}return f?-x:x; }inline int qpow(int x,int t){int res=1;while(t){if(t&1) (res*=x)%=mod;(x*=x)%=mod; t>>=1;}return res; }int n,m=1,p,cnt,tmp,ansodd,anseven=1;int main(){int n=rd();for(R int i=1;i<=n;++i){p=rd(); cnt=rd();(m*=qpow(p,cnt))%=mod;if(p>2){tmp=ansodd;(ansodd+=anseven*(p-1))%=mod;(anseven+=tmp*(p-1))%=mod;}}printf("%d\n%d\n%d\n",(anseven-1+mod)%mod,ansodd,((m-anseven-ansodd)%mod+mod)%mod);return 0; }
轉載于:https://www.cnblogs.com/SGCollin/p/9917095.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的[ NOI 2002 ] Robot的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java虚拟机6.HotSpot的GC实
- 下一篇: 粘包