1. 程式人生 > >2016多校訓練一 PowMod,hdu5728(尤拉函式+指數迴圈節)

2016多校訓練一 PowMod,hdu5728(尤拉函式+指數迴圈節)

Declare:
k=mi=1φ(in)mod1000000007

n is a square-free number.

φ is the Euler's totient function.

find:
ans=kkkk...kmodp

There are infinite number of k
Input Multiple test cases(test cases 100), one line per case.

Each line contains three integers, n,m and p.

1n,m,p107

Output For each case, output a single line with one integer, ans.
Sample Input 1 2 6 1 100 9
Sample Output 4 7

題意:只要是那個k是無限個

題解:首先是算k:先了解兩條性質,尤拉函式是積性函式;

(1)積性函式性質:F(m1*m2)=F(m1)*F(m2),當且近當gcd(m1,m2)=1時成立;

(2),其中p是n的素因子。這個用尤拉函式的素因子表示式很好證明。

有了這個再來算k,題目的n是很特殊的,它的每個素因子的冪次都是1:

那麼假設素數p是n的一個素因子,顯然gcd(p,n/p)=1;關鍵是i,如果i中沒有素因子p,那麼就直接用積性性質。如果i%p==0,必然可以寫成i=k*p;即倍數關係,否則i%p!=0;

所以分成兩部分求:


.....p是素數,素數的尤拉值就是p-1;


到這裡前兩和式是可以合併的,考慮和式的上下限,含義不同,第二項的i表示的p的倍數i*p才是第一項i的含義,相當於第二項剛好把第一項補齊了,那麼從1到m沒有遺漏,而且第二項的i用第一項替換后里面也是n/p;最終


這是個二元遞迴式:n/p和m/p看成整體,那麼設原先求的為f(n,m),所以f(n,m)=(p的尤拉值)*f(n/p,m)+f(n,m/p);

每次列舉一個就夠了,n每次要除以p,最多就是把它的每個素因子除完。

第二部分k的超級冪:用尤拉的定理:指數迴圈節


每次往冪次上一層模就取一次尤拉值,只有1的尤拉值等一自己,其他數的尤拉值都是小於自己的,所以模會不斷變小至1,顯然對1取模結果就是0,所以無限就變得有限了

#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<utility>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#include<iterator>
#include<stack>
using namespace std;
const int INF=1e9+7;
const double eps=1e-7;
const int N=1e7+5;
const int M=1000000007;
typedef long long ll;
int pri[N],phi[N];
bool vis[N];
int tot;
ll sum[N];
void init()
{
    int n=N;
    tot=0;
    memset(vis,false,sizeof vis);
    phi[1]=1;
    for(int i=2;i<n;i++)
    {
        if(!vis[i])
        {
            pri[tot++]=i;
            phi[i]=i-1;
        }
        for(int j=0;j<tot && i*pri[j]<n;j++)
        {
            vis[i*pri[j]]=true;
            if(i%pri[j]==0)
            {
                phi[i*pri[j]]=phi[i]*pri[j];
                break;
            }
            else phi[i*pri[j]]=phi[i]*(pri[j]-1);
        }
    }
    sum[0]=0;
    for(int i=1;i<N;i++)
        sum[i]=(sum[i-1]+phi[i])%M;
}
ll Pow(ll a,ll n,ll mod)
{
    ll ans=1;
    while(n)
    {
        if(n&1)
        {
            ans=ans*a%mod;
//            if(ans>=mod)ans=ans%mod;
        }
        a=a*a%mod;
//        if(a>=mod) a=a%mod;
        n>>=1;
    }
    if(ans==0) ans+=mod;
    return ans;
}
ll solve(ll k,ll mod)
{
    if(mod==1) return mod;
    ll tmp=phi[mod];
    ll up=solve(k,tmp);
    ll ans=Pow(k,up,mod);
    return ans;
}
int rear;
int a[15];
void resolve(ll n)
{
    for(int i=0;i<tot;i++)
    {
        if(!vis[n]) {a[rear++]=n;break;}
        if(n%pri[i]==0)
        {
            a[rear++]=pri[i];
            n/=pri[i];
        }
    }
}
ll f(int pos,ll n,ll m)
{
    //pos即每個素數,一次一個就行了
    if(n==1) return sum[m];//n為1結果就是尤拉值的字首和
    if(m==0)return 0;
    return ((a[pos]-1)*f(pos-1,n/a[pos],m)%M+f(pos,n,m/a[pos]))%M;
}
int main()
{
    init();//打表
    ll n,m,p;
    while(~scanf("%I64d%I64d%I64d",&n,&m,&p))
    {
        rear=0;
        resolve(n);//素因子分解
        ll k=f(rear-1,n,m);//算k
        ll ans=solve(k,p);
        printf("%I64d\n",ans%p);
    }
    return 0;
}


相關推薦

2016訓練 PowModhdu5728函式+指數迴圈

Declare:k=∑mi=1φ(i∗n)mod1000000007n is a square-free number.φ is the Euler's totient function. find:ans=kkkk...kmodp There are infini

牛客第四場A ternary string ----推公式和指數迴圈

Ternary String 時間限制:C/C++ 4秒,其他語言8秒 空間限制:C/C++ 131072K,其他語言262144K 64bit IO Format: %lld 題目描述 A ternary string is a sequenc

2016訓練#5 1012 HDU 5792 樹狀陣列 程式碼詳解

               World is Exploding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s

2016訓練Contest10: 1002 Hard problem hdu5858

Problem Description cjj is fun with math problem. One day he found a Olympic Mathematics problem for primary school students. It is to

2016訓練#1 1002 組合博弈

              對於一開始接觸博弈論的同學來說,這道題的思路略難,但是如果想到了把1*20的棋盤想象成一個20位的二進位制數,然後通過sg函式預處理得到每一個二進位制數相應的sg'值,最後直接用每一行的sg值相亦或即可。注意mex陣列,也就是vis陣列可以開得大

hdu5821(2016第8場暴力)

ZZX has a sequence of boxes numbered 1,2,...,n. Each box can contain at most one ball. You are given the initial configuration of the balls. For 1≤i≤n, i

牛客網訓練第一場 I - Substring後綴數組 + 重復處理

.com get 處理 man string target span roman targe 鏈接: https://www.nowcoder.com/acm/contest/139/I 題意: 牛客網多校訓練第一場 I - Substring(後綴數組 + 重復處理

HDU 5728 PowMod數論函式的各種性質

[題意] k=∑i=1mϕ(i∗n)%1000000007 其中n為無平方因子的數,求 ans=kkkk...k%p [分析] n無平方因子說明n可以表示為n=p1∗p2∗...∗pl

[HDU 5728] PowMod 函式的積性+公式降冪+

HDU - 5728 求 K=∑i=1mϕ(i∗n)mod1000000007 其中 n是 square-free number 求 ans=KKKK..modp 先求 K 由於 ϕ(n)是積性函式,所以對於 n的每個素因子可以提出

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,然

【數論】線性篩素數線性篩函式求前N個數的約數個數

先來最基本的線性篩素數,以後的演算法其實都是基於這個最基本的演算法: #include<stdio.h> #include<string.h> #define M 10000000 int prime[M/3]; bool flag[M]; void

HDU 5820 Lights 20167L主席樹

題意  給定n個平面上的點,座標範圍為[1, 50000]。如果對於任意兩個點,都可以通過直走(中途經過其他點)走到。    那麼輸出YES,否則輸出NO。   首先排序,去重。 我們要找的點對是隻能斜對角走到的點。 那麼找到這個點正左邊的離他最近的點和正上方最近的點。查詢以這三

HDU58232016第八場——color II 狀壓dp獨立集

First line contains an integer t. Then t testcases follow.  In each testcase: First line contains an integer n. Next n lines each contains a string consis

HDU 5732 2016Contest 1 Subway【找樹的重心判斷樹的同構】

題目大意: 給定一棵樹,這兩棵樹肯定是同構的。 問你,第一棵樹的每個節點,可以對應第二個樹的那個節點。 顯然對應方法不唯一,SPJ來檢測結果正確。 方法: 首先找樹的重心, 樹的重心最多2個。 一個重心的情況很多,兩個重心的情況如圖: 有人說這個圖太對稱了……

HDU 4920杭電訓練#5 1010 題 Matrix multiplication(不知道該掛個什麽帽子。。。

預處理 ica ref 循環 ring sca esp 題解 code 題目地址:HDU 4920 對這個題簡直無語到極點。。。竟然O(n^3)的復雜度能過。。。。方法有三。。 1:進行輸入優化和輸出優化。。(前提是你的輸入優化不能太搓。。。) 2:利用緩存優化。。詳情

【鏈表】2017訓練3 HDU 6058 Kanade's sum

iostream ++ 多校 open pos cnblogs names mat play acm.hdu.edu.cn/showproblem.php?pid=6058 【題意】 給定一個排列,計算 【思路】 計算排列A中每個數的貢獻,即對於每個ai,計算有

2016第4場 HDU 6076 Security Check DP,思維

pro begin sizeof || i++ 預處理 通過 第一個 ans 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6076 題意:現要檢查兩條隊伍,有兩種方式,一種是從兩條隊伍中任選一條檢查一個人,第二種是在每條隊伍

【組合數+Lucas定理】2017訓練七 HDU 6129 Just do it

clu sca def opened == cnblogs long 合數 color http://acm.hdu.edu.cn/showproblem.php?pid=6129 【題意】 對於一個長度為n的序列a,我們可以計算b[i]=a1^a2^......^ai,

【雙向bfs】2017訓練十 HDU 6171 Admiral

isp hide splay 編號 sig push pac ans logs 【題意】 現在給出一個三角矩陣,如果0編號的在點(x,y)的話,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)這些點進行交換。 我們每一次只能對0點和其他點進行交

牛客網訓練 道路問題

一個 question 有道 void lib 以及 -h 測試 iostream 題目描述 隨著如今社會的不斷變化,交通問題也變得越來越重要,所以市長決定建設一些公路來方便各個城市之間的貿易和交易。雖然市長的想法很好,但是他也遇到了一般人也經常頭疼的問題,那就是手頭