E 求1-n与n的最大公约数大于m的和

2024-06-07 03:48
文章标签 大于 最大公约数

本文主要是介绍E 求1-n与n的最大公约数大于m的和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:点击打开链接

题意:给n,m。求x(1<=x<=n)的和,其中gcd(x,n)>=m。

学习了,一个欧拉函数求和的问题。

Euler_sum(n)=n*Euler(n)/2;也就是求的与n互质的数的和。。

代码:

LL Euler_sum(LL n){if(n==1) return 1;//n==1时候,需要特判。else return n*Euler(n)/2;
}

对该题的话。

我们需要做的就是,枚举n的因子。寻找gcd(x,n)=n的因子。

假设n的因子为d(d>=m),也就说求gcd(x,n)=d。我们知道d*gcd(x/d,n/d)=1;n/d和x/d是互质的。

说也就是求1-n/d内与n/d互质的和。乘以一个d就是x,gcd(x,n)=d和。


表述不清。

直接代码:

#include <cstdio>
#include <cstring>
#include <cmath>
#define bug puts("bingo!")
using namespace std;
#define LL long long
const LL mod=1e9+7;LL Euler(LL n){LL ans=n;for(LL i=2;i<=sqrt(n);i++){if(n%i==0){while(n%i==0) n=n/i;ans=ans/i*(i-1);}}if(n>1) ans=ans/n*(n-1);return ans;
}LL Euler_sum(LL n){if(n==1) return 1;else return n*Euler(n)/2;
}int main(){int T;scanf("%d",&T);while(T--){LL n,m,ans=0;scanf("%lld%lld",&n,&m);for(int i=1;i*i<=n;i++){if(n%i==0){int d;if(i>=m){d=i;ans=(ans+d*Euler_sum(n/d))%mod;}if(i*i!=n&&n/i>=m){d=n/i;ans=(ans+d*Euler_sum(n/d))%mod;}}}printf("%lld\n",ans%mod);}return 0;
}

数论需要继续学习。。。。。。

这篇关于E 求1-n与n的最大公约数大于m的和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038085

相关文章

18053 大于平均分

### 思路 1. 输入10个整数并存储在数组中。 2. 计算这10个整数的总和。 3. 计算平均值。 4. 统计有多少个数比平均值大。 5. 输出统计结果。 ### 伪代码 1. 初始化一个数组 `arr` 用于存储10个整数。 2. 初始化变量 `sum` 为0,用于存储总和。 3. 初始化变量 `count` 为0,用于统计比平均值大的数的个数。 4. 循环读取10个整数并存储在数组

js,找出两个数的最大公约数

/*比如说有要求a、b两个整数的最大公约数,a>b,那么我们先用a除以b,得到商8,余数r1:a÷b=q1…r1 我们当然也可以把上面这个式子改写成乘法式:a=b*q1+r1     如果r1=0,那么b就是a、b的最大公约数。 要是r1≠0,就继续除,用b除以r1,我们也可以有和上面一样的式子:b=r1*q2+r2    如果余数r2=0,那么r1就是所求的最大公约数。*/ fun

数据结构-非线性结构-树形结构:有序树 ->二叉树 -> 平衡二叉树(任何节点的左右子树的高度差不大于1)-> 完全二叉树(除最底层外的其他层都被填满,且最底层左到右填入) -> 堆(优先队列)

完全二叉树:即除了最底层,其他层的节点都被元素填满,且最底层左到右填入。 完全二叉树属于平衡二叉树。 堆是一种完全二叉树,且满足以下条件: 最大堆:每个节点都比其子树所有节点大的完全二叉树;最小堆:每个节点都比其子树所有节点小的完全二叉树; 我们对堆中的结点按层进行编号,可以将堆逻辑结构映射到数组中 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i

迭代和递归(Python)--乘方、最大公约数、汉诺塔、斐波那契、回文字符串

1.迭代 def iterPower(base,exp):result=1.0while exp>0:result*=baseexp-=1return result 运行结果: 2.递归的乘法运算: def recurMul(a,b):if b==1:return aelse:return a+recurMul(a,b-1) 运行结果: 3.递归乘方

从数据集中挑选红色区域大于某一阈值的图片

算法训练时需要对图片进行过滤,改脚本用来从数据集中挑选中图片中红色区域大于某一阈值的图片。 #!usr/bin/env python#-*- coding:utf-8 _*-import osimport shutilimport numpy as npimport cv2lower_red = np.array([0, 127, 128]) # 红色阈值下界higher_red =

微信大于1G文件转输不了的解决方案

前言:今天要传输大文件 大于1GB 微信传输不了,提示大于1G 想到了使用网盘传输,结果显示需要15小时下载时间, 于是选择在线下载,没想到各种套路和广告,把卸载很久的QQ又重新安装上了,结果显示版本太低了,重新安装的最新片,发现密码不记得了,经过好几次尝试终于成功了。 使用工具:QQ最新版 文件离线上传 方法:通过QQ离线上传功能将大于1G的文件上传到QQ,然后通过另一个QQ号登录到其它电脑

C语言实现获得文件大小,大于某个值,删除该文件

C语言实现获得文件大小,大于某个值,删除该文件 #include <stdio.h>#define ONE_MB 1024*1024long get_file_size(char* file_name);int main(int argc, char *argv[]){long length = get_file_size("aaa.txt");if (length > ONE_MB){u

最大公约数和最小公倍数(gcd)

GCD算法在ACM算法中不是很常见,但是遇上了不会写也不行,我看过递归的gcd算法,感觉数据一大,可能会崩溃,不如循环快,所以总结一个模板: #include <stdio.h>#include <stdlib.h>#include <string.h>int gcd(int a, int b){int r;while(b!=0){r=b;b=a%b;a=r;}return a;}i

Mybatis的xml中的like模糊查询、大于、小于

模糊查询concat(’%’,#{userId},’%’)拼接的形式,想前匹配就去掉前面的百分号,后匹配就去掉后面的模糊查询‘%#{userId}%’粗暴形式,不是太推荐,有可能会抛空指针异常,使用的时候要做非空判断–––大于& gt;去掉&和gt中间的空格,这个网页会自动翻译–––大于等于& gt;=去掉&和gt中间的空格,这个网页会自动翻译–––小于& lt;去掉&和lt中间的空格,这个网页会

java如何判断一个列表中是否存在大于1000的数字

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导航: 码农阿豪系列专栏导航 面试专栏:收集了java相关高频面试题,面试实战