最大公约数之和 51Nod - 1040

2024-02-22 18:08
文章标签 51nod 最大公约数 1040

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

https://www.51nod.com/Challenge/Problem.html#!#problemId=1040

求所有gcd之和 就看n的每个因子会做出多少贡献即可 即对n的某个因子x 有贡献的i满足gcd(n,i)=x 从而推出gcd(n/x,i/x)=1

这样问题就转换为 对每个因子x求n/x的欧拉函数值了

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;ll pre[maxn];
ll n;
int tot;ll geteular(ll p)
{ll res,i;res=p;for(i=2;i*i<=p;i++){if(p%i==0){res=(res*(i-1))/i;while(p%i==0) p/=i;}}if(p!=1) res=(res*(p-1))/p;return res;
}int main()
{ll ans,i;scanf("%lld",&n);for(i=1;i*i<=n;i++){if(n%i==0){pre[++tot]=i;if(i*i!=n) pre[++tot]=n/i;}}ans=0;for(i=1;i<=tot;i++) ans+=geteular(n/pre[i])*pre[i];printf("%lld\n",ans);return 0;
}

 

这篇关于最大公约数之和 51Nod - 1040的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Transportation-POJ 1040

DFS练习题,直接暴力吧,600+MS过的。。。。不能DP,有后效性,还有以后少用memcpy了,复杂度好大。。。。。 #include<cstdio>#include<cstring>#include<iostream>using namespace std;int max_size,n,m;#define MAXD 100 + 10#define max(a,b) (a >

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

【51nod】算法马拉松4 F 移数字 【快速求N!%P】【FFT】

传送门:【51nod】算法马拉松4 F 移数字 涉及知识点:多项式求逆,多项式除法,多点插值,阶乘取模。 对于N!%P,复杂度为 O(N−−√log2N−−√) O(\sqrt N \log^2\sqrt N)。 但常数巨大,和暴力算实际复杂度只相差常数= = 这个是可以扩展到组合数取模的~ my  code: my~~code: #include <stdio.h>#includ

【数论 排序 滑动窗口】1040. 移动石子直到连续 II

本文涉及知识点 排序 质数、最大公约数、菲蜀定理 C++算法:滑动窗口总结 LeetCode1040. 移动石子直到连续 II 在一个长度 无限 的数轴上,第 i 颗石子的位置为 stones[i]。如果一颗石子的位置最小/最大,那么该石子被称作 端点石子 。 每个回合,你可以将一颗端点石子拿起并移动到一个未占用的位置,使得该石子不再是一颗端点石子。 值得注意的是,如果石子像 stones

迭代和递归(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.递归乘方

最大公约数和最小公倍数(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

编写程序,采用辗转相除法求解两个正整数的最大公约数

--编写程序,采用辗转相除法求解两个正整数的最大公约数DECLARE @a int,@b intSELECT @a=12,@b=21DECLARE @temp intprint cast(@a as varchar(5))+'和'+cast(@b as varchar(5))+'的最大公约数是'if @a<@b --或者是select @temp=@a,@a=@b,@b=@tempb

一行代码求两个数的最大公约数

import java.util.*;//一行代码求两个数的最大公约数public class getGCD{//获得最大公约数(辗转相除法)public static int gcd(int m,int n){return n==0?m:gcd(n,m%n);}public static void main(String[]args){Scanner sin=new Scanner(S

059、Python 函数练习:用函数实现求两个数的最大公约数和最小公倍数

普及:写程序有两个终极原则:高内聚,低耦合。 所谓高内聚指的是一个模块或类内部各个元素(方法、属性等)彼此关联紧密,共同完成一个特定的任务或目标。具有高内聚的模块或类内的元素之间联系紧密,功能相关联,实现单一功能的代码集中在一起。 所谓低耦合指的是模块或类之间的依赖关系尽可能地降低,模块之间通过接口进行通信,各模块之间独立性强,一个模块的改动不会对其他模块造成较大影响。低耦合的设计使得系统更容

mysql(mariadb)报错超过连接数: ERROR 1040 (HY000): Too many connections

在此记录下解决过程 1、vi /etc/my.cnf  [Service]新添加两行如下参数: wait_timeout = 600 interactive_timeout = 600 max_connections=4096 2、vi  usr/lib/systemd/system/mariadb.service [Service]新添加两行如下参数: LimitNOFILE=1