博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDOJ】4983 Goffi and GCD
阅读量:7079 次
发布时间:2019-06-28

本文共 1531 字,大约阅读时间需要 5 分钟。

题意说的非常清楚,即求满足gcd(n-a, n)*gcd(n-b, n) = n^k的(a, b)的不同对数。显然gcd(n-a, n)<=n, gcd(n-b, n)<=n。因此当n不为1时,当k>2时,不存在满足条件的(a,b)。而当k=2时,仅存在(n, n)满足条件。因此仅剩n=1以及k=1需要单独讨论:

当n = 1时,无论k为何值,均有且仅有(1,1)满足条件,此时结果为1;
当k = 1时,即gcd(n-a, n)*gcd(n-b, n) = n,则令gcd(n-a, n) = i,则gcd(n-b, n) = n/i。也即求(n-a)/i与n/i互素且(n-b)/(n/i)与n/(n/i)互素的(a, b)的对数和。

1 #include 
2 #include
3 4 const int MOD = (1e9+7); 5 6 __int64 getNotDiv(int x) { 7 int i, r = x; 8 __int64 ret = x; 9 10 for (i=2; i*i<=r; ++i) {11 if (x%i == 0) {12 ret -= ret/i;13 while (x%i == 0)14 x /= i;15 }16 }17 if (x > 1)18 ret -= ret/x;19 return ret;20 }21 22 int main() {23 int n, k;24 int i, j;25 __int64 ans, tmp;26 27 while (scanf("%d %d", &n, &k) != EOF) {28 if (n==1 || k==2)29 printf("1\n");30 else if (k==1) {31 ans = 0;32 for (i=1; i*i<=n; ++i) {33 if (n%i == 0) {34 j = n/i;35 tmp = getNotDiv(i)*getNotDiv(j)%MOD;36 if (j == i) {37 ans += tmp;38 } else {39 ans += tmp<<1;40 }41 ans %= MOD;42 }43 }44 printf("%I64d\n", ans%MOD);45 } else {46 printf("0\n");47 }48 }49 50 return 0;51 }

 

转载于:https://www.cnblogs.com/bombe1013/p/3938266.html

你可能感兴趣的文章
GO语言的进阶之路-协程和Channel
查看>>
Rust 1.7.0 处理命令行參数
查看>>
Oschina 安卓client源代码学习之中的一个
查看>>
halcon连续采集图像
查看>>
GitHub分支项目不支持搜索问题解决:Sorry, forked repositories are not currently searchable....
查看>>
iphone数据存储之-- Core Data的使用(一)
查看>>
Emmet:HTML/CSS代码快速编写神器
查看>>
[原]设置vs的release版本调试
查看>>
Spark Mllib里如何将如温度、湿度和风速等数值特征字段用除以***进行标准化(图文详解)...
查看>>
Object 转换为 BigDecimal
查看>>
Apache与Nginx的优缺点比较
查看>>
python接口自动化测试(三)-requests.post()
查看>>
css3常用动画样式文件move.css
查看>>
统计学中RR OR AR HR的区别
查看>>
java面试⑤前端部分
查看>>
[Oracle]System 表空间的文件丢失
查看>>
[LeetCode] Implement Magic Dictionary 实现神奇字典
查看>>
blender split mesh
查看>>
MongoDB官方C#驱动中查询条件Query用法
查看>>
vim插件ctags的安装和使用【转】
查看>>