设为首页 加入收藏

TOP

从“最简真分数的个数”谈起(三)
2019-09-14 00:51:37 】 浏览:226
Tags:简真 分数 个数 谈起
;    输入一个正整数N(1 ≤ N ≤ 1000000000),求1~N-1中所有与N不互质的数的和。两个正整数a和b,如果a和b的最大公约数gcd(a,b)>1,则a与b不互质。由于所求和值较大,输出其模1000000007的结果。

      (1)编程思路。

       先需明白一个简单的定理:若 gcd(n,i)=1,则 gcd(n,n-i)=1。 即如果n与i互质,则n与n-i一定互质。

      因此,本题我们可以先求所有与n互质的数的和sum。由于与n互质的数两两配对(i与n-i)的和为n。这样,

            sum=n* phi(n)/2 。   phi(n)是欧拉函数,其值为1~n中所有与n互质的数的个数。由于题目中N值较大,筛法用数组保存不恰当,因此直接采用例1中得源程序2的思路求欧拉函数的值。

       求得sum后,输出的答案应为 [(n-1)*n/2-sum] % 1000000007 。 

      (2)源程序。

#include <stdio.h>
#define MOD 1000000007
int main()
{
      __int64 n,t,sum,ans;
      int i;
      while (scanf("%I64d", &n) && n!=0)
      {
              sum = n;
              t=n;
              for (i=2;i*i<=t;i++)
                   if (t % i == 0) // 找到一个质因数i
                   {
                          sum -= sum/i;
                          while (t % i == 0) // 将质因数i全去掉
                                 t /= i;
                    }
            if (t!=1) sum -= sum/t;
            ans=n*(n-1)/2;
            sum=n*sum/2;
            ans=(ans-sum)% MOD;
            printf("%d\n",ans);
      }
      return 0;
}

将此源程序提交给 HDU 3501 “Calculation 2”,可以Accepted。

 

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇变量的实现机制 下一篇QRowTable表格控件(四)-效率优化..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目