description

在高数课上老师给出了一个等式GCD(n-a,n)*GCD(n-b,n)=n^k;

已知,n,k,问同学们有多少组(a,b)满足这个等式。结果对10^9+7取模。

1<=a,b<=n

只需考虑k=1的情况。

设g= GCD(n-a,n)。

g*k1=n-a g*k2=n

k1与k2互质,且k1<k2。

选择一个身为n的因子g= GCD(n-a,n),有多少种a可以选择呢?也就是说有多少个k1可以满足上述条件。

这不就是欧拉函数吗,,哈哈!!!,也就是说a共有euler(n/g)种选择。

现在对于g1*g2=n,共有euler(g2)* euler (g1)种选择。

因为euler(n) = n(1-1/p1)(1-1/p2)……(1-1/pr),可以想到 euler(g2)* euler(g1)其中包括g1*g2,还有n的质因数,这些质因数有些被乘了两次。所以对于g1,g2,只需要找出他们的最大公约数再巴拉巴拉。。。。,一些细节要考虑啊。

#include <stdio.h>
#include<cstring>
using namespace std;
const int MAXN=10000;
int prime[MAXN+1];
void getPrime()
{ memset(prime,0,sizeof(prime)); for(int i=2; i<=MAXN; i++) { if(!prime[i]) prime[++prime[0]]=i; for(int j=1; j<=prime[0]&&prime[j]<=MAXN/i; j++) { prime[prime[j]*i]=1; if(i%prime[j]==0) break; } }
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x)
{ fatCnt=0; long long tmp=x; for(int i=1; prime[i]<=tmp/prime[i]; i++) { factor[fatCnt][1]=0; if(tmp%prime[i]==0) { factor[fatCnt][0]=prime[i]; while(tmp%prime[i]==0) { factor[fatCnt][1]++; tmp/=prime[i]; } fatCnt++; } } if(tmp!=1) { factor[fatCnt][0]=tmp; factor[fatCnt++][1]=1; } return fatCnt;
} int n,k;
long long euler[40001];
void getEuler()
{ memset(euler,0,sizeof(euler)); euler[1] = 1; for(int i = 2; i <= 40000; i++) if(!euler[i]) //i是素数 for(int j = i; j <= 40000; j += i) { if(!euler[j]) euler[j] = j; euler[j] = euler[j]/i*(i-1); }
}
int gcd(int a,int b)
{ if(a==0) return b; return gcd(b%a,a);
}
int main()
{ getPrime(); getEuler(); while(scanf("%d%d",&n,&k)!=EOF) { getFactors(n); long long ret = n; for(int i = 0; i < fatCnt; i++) { ret = ret/factor[i][0]*(factor[i][0]-1); } long long ans=(ret*2)%1000000007; if(k>2) puts("0"); else if(k==2) puts("1"); else if(k==1) { int i; for(i=2; i*i<n; i++) { if(n%i==0) { //printf("%d %d\n",i,n/i); //printf("%d %d\n",n/i,i); ans+=ret*euler[gcd(i,n/i)]/gcd(i,n/i)*2; if(ans>1000000007) ans%=1000000007; } } if(i*i==n) { if(n%i==0) { //printf("%d %d\n",i,n/i); ans+=ret*euler[gcd(i,n/i)]/gcd(i,n/i); if(ans>1000000007) ans%=1000000007; } } //ans++;ans%=1000000007; printf("%lld\n",ans); } } return 0;
}

转载于:https://www.cnblogs.com/lastone/p/5262220.html

[数论-欧拉函数的应用]NEFU 1115相关推荐

  1. hdu1395 数论 欧拉函数

    hdu1395 数论   欧拉函数 对于给出的每一个n 求最小正整数 x 满足 2^x mod n = 1 1.如果给出的n 是偶数或者 1 则一定无解 2.如果是奇数 首先根据欧拉定理 我们可知 p ...

  2. 第二十六章 数论——欧拉函数(详解与证明)

    第二十六章 数论--欧拉函数(详解与证明) 欧拉函数 1.互质 2.欧拉函数的定义 3.欧拉函数的公式 4.欧拉函数的证明 5.欧拉函数的使用 (1)问题一: 思路 代码 (2)问题二: 思路 cas ...

  3. CCPC-Wannafly Winter Camp Day3 (Div2, onsite) F 小清新数论 欧拉函数的利用 莫比乌斯反演 杜教筛

    F - 小清新数论 做法一:欧拉函数 #include<stdio.h> #include<bits/stdc++.h> using namespace std; #defin ...

  4. 费马定理中值定理_数论-欧拉函数、欧拉定理

    欧拉函数 积性函数 满足 ( 互质) 定义 对于正整数 ,欧拉函数是小于等于 的所有数中与 互质的数的 个数. 欧拉函数是积性函数(这个证明不是很显然,这个链接里面有很多种证明方法) 记作: 公式 , ...

  5. 中高级数论 [欧拉函数线性筛,二次剩余]

    欧拉函数线性筛 对于素数ppp, φ(p∗i)={p−1i=1p∗φ(i)p∣i(p−1)∗φ(i)p∤i\varphi (p*i)= \begin{cases} p-1& i=1\\ p*\ ...

  6. nssl1232-函数【数论,欧拉函数,莫比乌斯反演】

    正题 题目大意 ∑d∣nf(d)=n\sum_{d|n}f(d)=nd∣n∑​f(d)=n 对于n个aia_iai​ 求 ∑i=1nf(ai)\sum_{i=1}^nf(a_i)i=1∑n​f(ai​ ...

  7. 数论 —— 欧拉函数

    [定义] 对正整数 n,欧拉函数是小于等于 n 的数中与 n 互质的数的个数,记作: 例如:,因为 1.3.5.7 均与 8 互质. [性质] 1)若 n 为一素数 p,则: 2)若 n 为一素数 p ...

  8. [HAOI2012]外星人——数论欧拉函数

    题目描述 艾利欧在她的被子上发现了一个数字 NNN,他觉得只要找出最小的 xxx 使得 φx(N)=1\varphi^x(N)=1φx(N)=1 根据这个 xxx 她就能找到曾经绑架她的外星人的线索了 ...

  9. P2303 [SDOI2012] Longge(数论/欧拉函数)

    P2303 [SDOI2012] Longge 一道看似非常基础的数论题,但是蕴含了非常多的知识,求解 ∑i=1ngcd(i,n)\sum_{i=1}^ngcd(i,n) i=1∑n​gcd(i,n) ...

最新文章

  1. 未老先呆,这锅熬夜真的要背:生物钟影响阿尔茨海默症的机制被发现
  2. 计算机处理器采用多核,电脑的CPU的多核很有用吗?
  3. 【STM32】FreeRTOS中断示例
  4. 程序员搞笑故事:给女儿织的辫子 ​​​​,你知道是什么算法吗?
  5. java c++ python哪个好_程序员学java好还是python语言好 c++又如何
  6. java开源服务框架_Java框架服务
  7. CXF生成本地ws调用代码测试webservice
  8. 零起点英语_【德国零起点】05—变元音字母
  9. matplotlib交互模式与pycharm单独Figure设置
  10. FLEX 2.01 全套下载!
  11. CentOS 7完全卸载MySQL
  12. OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x000001faf3e50000
  13. 用python实现单词本功能
  14. 上海智能交通建设现状与未来发展要点
  15. Python3爬取搜狗微信公众号
  16. 集美福利!陈睿当时加入B站的故事分享
  17. tig--颠覆 Git 命令使用体验的神器
  18. 2016年全国高中数学联赛加试T3解答
  19. 超级电容锂电池混合储能Simulink仿真
  20. 解决Cannot create PoolableConnectionFactory (Access denied for user 'xxx'@'xxx.xxx.xx.xxx' (using pas

热门文章

  1. 表单验证之validform.js使用方法
  2. 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
  3. maven配置篇之pom.xml
  4. (step3.3) hdu 1059(Dividing——多重背包)
  5. 超外差和超再生模块有何区别?
  6. Exception Handling Application Block (5)详细解
  7. Redis之高级特性
  8. python安装dlib要cmake,如何使用cmake解决dlib错误?
  9. (44)FPGA面试题CMOS和TTL电路区别
  10. (34)FPGA面试技能提升篇(高速SERDES)