HDU 3501 数论 欧拉函数的应用
来源:互联网 发布:确保数据完整准确 编辑:程序博客网 时间:2024/06/05 08:25
题目链接
题意:已知一个数n,求小于n且与其gcd不为1的所有数的和
思路:
首先第一感觉便是正难则反,可以先求小于n且与n互质的数的和。但是已知的欧拉函数是求个数的,但如何来求和呢?
这里涉及了一个公式:
为什么有这个公式呢 其实理解起来很简单:
我们求两个数的GCD是常用的是辗转相除法,但同时还有一个古老的方法常被我们忽略,那就是:更相减损法
下面来自百度百科:
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
而该办法基于的原理便是
故若有一个数 k < n 且 gcd(n,k) = 1
则一定存在 n-k,且 gcd(n,n-k) = 1
故当我们求所有 k的和时,可以两两分组,且每一组的和就是n
故有该公式 :
(上述并不是严谨的证明,只是便于理解和记忆公式)
有了该公式,此题便很简单了~
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>using namespace std;typedef long long ll;const int mod = 1000000007;const int A = 1e5 + 10;bool vis[A];int pri[A],tot;void init(){ tot = 0; vis[0] = vis[1] = 1; for(int i=2 ;i<A ;i++){ if(vis[i] == 0) pri[++tot] = i; for(int j=1 ;j<=tot&&pri[j]*i<A ;j++){ vis[pri[j]*i] = 1; if(i%pri[j] == 0) break; } }}int main(){ init(); ll n; while(~scanf("%I64d",&n) && n){ ll ans = (n*(n-1)/2)%mod; ll res = n,m = n; for(int i=1 ;i<=tot&&pri[i]*pri[i]<=n ;i++){ if(n%pri[i] == 0){ res = res/pri[i]*(pri[i]-1); while(n%pri[i] == 0) n/=pri[i]; } } if(n!=1) res = res/n*(n-1); //printf("%I64d\n",res); ans = ans - res*m/2; printf("%I64d\n",(ans%mod+mod)%mod); } return 0;}
阅读全文
0 0
- HDU 3501 数论 欧拉函数的应用
- [数论-欧拉函数的应用]NEFU 1115
- hdu 数论+ 欧拉函数 1787
- hdu 2588 GCD [欧拉函数]【数论】*
- HDU 2588 GCD [欧拉函数]【数论】
- HDU 2588 数论 欧拉函数
- 【数论-欧拉函数】HDU 3501 Calculation 2 ( 与n不互质的数的和 )
- GCD +hdu+欧拉函数的应用
- Hdu 2824 欧拉函数的应用
- HDU 2588 欧拉函数的应用
- hdu 2588 欧拉函数的应用
- HDU 3501 Calculation 2(欧拉函数的应用)
- hdu 3501(欧拉函数的应用)
- HDU -- 3501 Calculation 2 【欧拉函数性质的应用】
- 数论欧拉函数
- 欧拉函数(数论)
- 数论-欧拉函数
- 欧拉函数---数论
- 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- python 获得对象的所有属性和方法
- 51定时器初始化步骤
- 简单几步实现在AndroidStudio中导出Jar包
- libcore.java.text.DateFormatSymbolsTest测试fail两条
- HDU 3501 数论 欧拉函数的应用
- ServletContext域对象
- 自定义Dialog(org.eclipse.jface.dialogs.Dialog)
- 新手刚刚接触SASS对安装与编译上面的不理解
- 【实践】CTR中xgboost/gbdt +lr
- Eclipse Debug提示source not found解决方案
- 集体智慧编程第十一章---用java编写(小部分)
- @RequestParam与@PathVariable的区别
- 河蚌很棒