1. 程式人生 > >HDU4983 Goffi and GCD (尤拉函式求解gcd個數)

HDU4983 Goffi and GCD (尤拉函式求解gcd個數)

題意簡潔明瞭,大意就是說有這樣一條公式----<span style="font-family: 'Times New Roman'; font-size: 14px;"> </span><span class="MathJax_Preview" style="color: rgb(136, 136, 136); font-family: 'Times New Roman'; font-size: 14px;"></span><span class="MathJax" id="MathJax-Element-1-Frame" role="textbox" aria-readonly="true" style="display: inline; font-size: 14px; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; font-family: 'Times New Roman';"><nobr style="transition: none; border: 0px; padding: 0px; margin: 0px; max-width: none; max-height: none; min-width: 0px; min-height: 0px; vertical-align: 0px;"><span class="math" id="MathJax-Span-1" style="transition: none; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 15.329em;"><span style="transition: none; display: inline-block; position: relative; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 14.844em; height: 0px; font-size: 14.42px;"><span style="transition: none; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.668em 1000em 3.193em -0.621em); top: -2.701em; left: 0.003em;"><span class="mrow" id="MathJax-Span-2" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px;"><span class="mo" id="MathJax-Span-3" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">gcd</span><span class="mo" id="MathJax-Span-4" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">(</span><span class="mi" id="MathJax-Span-5" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-6" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-7" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">a</span><span class="mo" id="MathJax-Span-8" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-9" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.142em; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-10" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-11" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">×</span><span class="mo" id="MathJax-Span-12" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">gcd</span><span class="mo" id="MathJax-Span-13" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">(</span><span class="mi" id="MathJax-Span-14" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-15" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">−</span><span class="mi" id="MathJax-Span-16" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.212em; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">b</span><span class="mo" id="MathJax-Span-17" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">,</span><span class="mi" id="MathJax-Span-18" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.142em; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">n</span><span class="mo" id="MathJax-Span-19" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">)</span><span class="mo" id="MathJax-Span-20" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.281em; margin: 0px; vertical-align: 0px; font-family: MathJax_Main;">=</span><span class="msubsup" id="MathJax-Span-21" style="transition: none; display: inline; position: static; border: 0px; padding: 0px 0px 0px 0.281em; margin: 0px; vertical-align: 0px;"><span style="transition: none; display: inline-block; position: relative; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 1.182em; height: 0px;"><span style="transition: none; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; clip: rect(1.807em 1000em 2.639em -0.621em); top: -2.424em; left: 0.003em;"><span class="mi" id="MathJax-Span-22" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-family: MathJax_Math-italic;">n</span><span style="transition: none; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.431em;"></span></span><span style="transition: none; position: absolute; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; top: -2.632em; left: 0.628em;"><span class="mi" id="MathJax-Span-23" style="transition: none; display: inline; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; font-size: 12px; font-family: MathJax_Math-italic;">k</span><span style="transition: none; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.292em;"></span></span></span></span></span><span style="transition: none; display: inline-block; position: static; border: 0px; padding: 0px; margin: 0px; vertical-align: 0px; width: 0px; height: 2.708em;"></span></span></span><span style="transition: none; display: inline-block; position: static; border-width: 0px 0px 0px 0.004em; border-left-style: solid; border-color: initial; padding: 0px; margin: 0px; vertical-align: -0.354em; overflow: hidden; width: 0px; height: 1.289em;"></span></span></nobr></span><span style="font-family: 'Times New Roman'; font-size: 14px;">.。</span>
<span style="font-family:Times New Roman;">求在給出輸入n,k的情況下,滿足公式條件的對數,並將結果取模。此題勿忘一個條件!!!即(1,2)和(2,1)是兩對!這個坑找了我好久23333_(:з」∠)_。。。</span>
<span style="font-family:Times New Roman;">思路:顯然一個gcd在取最大值情況下,值為n,故k最大值為2,且k == 2時,結果只有一種,當n == 1時,結果也只有一種,故以上兩種情況直接輸出1。當k > 2時,顯然沒有滿足條件的gcd數對,故為零。此時我們只需要求k == 1的情況。</span>
<span style="font-family:Times New Roman;">設gcd(n - a,n)值為k,易知gcd(n - b,n) == n / k,從1到sqrt(n * 1.0)遍歷列舉k,此時應用尤拉函式,求出當滿足條件時候的值。設gcd(n - a,n)的個數為ans,gcd(n - b,n)為res。對於k,當k*k == n時,結果為ans * res,反之,為2 * ans * res!這就是我前面說的那個坑啊_(:з」∠)_!!!</span>
<span style="font-family:Times New Roman;">
</span>
<span style="font-family:Times New Roman;">程式碼:</span>
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long euler(long long x)  //尤拉函式
{
    long long res = x;
    for(int i = 2;i * i <= x; i++)
    {
        if(x % i == 0)
        {
            res = res / i * (i - 1);
            while(x % i == 0)
                x /= i;
        }
    }
    if(x > 1)
        res = res / x * (x - 1);
    return res;
}
int main()
{
    long long n,k;
    while(cin>>n>>k)
    {
        long long tot = 0;
        if(k == 2 || n == 1)
        {
            printf("1\n");
            continue;
        }
        if(k > 2)
        {
            printf("0\n");
            continue;
        }
        for(int i = 1;i <= sqrt(n * 1.0);i++)
        {
            if(n % i == 0)
            {
                long long ans = euler(n / i);
                long long res = euler(i);
                if(i * i != n)
                    res = res % mod * 2;
                tot = (tot + res * ans % mod) % mod;
            }
        }
        printf("%lld\n",tot);
    }
    return 0;
}