Goffi and GCD
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 935 Accepted Submission(s): 313
Problem Description
Goffi is doing his math homework and he finds an equality on his text book: gcd(n−a,n)×gcd(n−b,n)=nk.
Goffi wants to know the number of (a,b) satisfy the equality, if n and k are given and 1≤a,b≤n.
Note: gcd(a,b) means greatest common divisor of a and b.
Goffi wants to know the number of (a,b) satisfy the equality, if n and k are given and 1≤a,b≤n.
Note: gcd(a,b) means greatest common divisor of a and b.
Input
Input contains multiple test cases (less than 100). For each test case, there's one line containing two integers n and k (1≤n,k≤109).
Output
For each test case, output a single integer indicating the number of (a,b)
modulo 109+7.
Sample Input
2 1 3 2
Sample Output
2 1HintFor the first case, (2, 1) and (1, 2) satisfy the equality.题意简洁明了,大意就是说有这样一条公式----<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; }