zoukankan      html  css  js  c++  java
  • 小A的数学题


    小A最近开始研究数论题了,这一次他随手写出来一个式子,

    但是他发现他并不太会计算这个式子,你可以告诉他这个结果吗,答案可能会比较大,请模上1000000007。

    输入描述:

    一行两个正整数n,m一行两个正整数n,mnm

    输出描述:

    一行一个整数表示输出结果一行一个整数表示输出结果
    示例1

    输入

    复制
    2 2

    输出

    复制
    7

    备注1≤n,m≤1e61 leq n,m leq 1e61n题意:给定两个数,n,m;求(1~n)(1~m)的 gcd(i,j)平方和


    思路:简单暴力肯定超时,
    看两个数的最大公约数,我们反过来求,从min(n,m)最大的可能公约数开始逐级递减
    从min(n,m)~1
    令 p = min(n,m),
    那么在n里面p的倍数有n/p个,即有n/p个数存在p这个约数
    对于m而言也一样;
    之后再从 p*2开始将所有p的倍数再减掉,剩下的就是约数最大为p的个数,即对于n,m而言就是gcd(n,m)==p的所有组合为(n/p)*(m/p);

    例子
    n = 9, m= 7;
    p = 7;
    gcd(i,j) == 7;
    f[7] = 1;
    gcd(i,j)=6;
    f[6]=1;
    gcd(i,j) = 5;
    f[5]=5;
    gcd(i,j)=4;
    f[4]=2;
    gcd(i,j)=3;
    f[3]=5;
    gcd(i,j)=2;
    f[2]=9;
    f[1]=44;

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 typedef long long ll;
     5 const int N = 1e6+10;
     6 #define mod 1000000007
     7 ll n,m;
     8 ll num;
     9 ll f[N];
    10 int main()
    11 {
    12     scanf("%lld%lld",&n,&m);
    13     for(int i = min(n,m); i >=1;i--)
    14     {
    15         f[i] = (n / i) * (m / i);
    16         for(int j = 2 * i; j <= min(n , m); j += i)
    17         {
    18             f[i] -= f[j];
    19         }
    20         //cout << f[i]<<' '<<i<<endl;
    21         num = (num + f[i] * i % mod * i % mod )%mod;
    22     }
    23     cout << num <<endl;
    24     return 0;
    25 }
    View Code
     
     
     
    你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。
  • 相关阅读:
    什么是OOAD?什么是UML?
    Linux下Gvim 的基本操作-适合新手看
    关于mongodb ,redis,memcache之间见不乱理还乱的关系和作用
    phpcms常用标签
    请问如何更改dedecms“文件保存目录”的字符限制 ?
    如何通过刷百度指数来提高网站的权重
    HDU 1263(水果统计 **)
    HDU 1284(钱币兑换 背包/母函数)
    HDU 1028(数字拆分 分治)
    HDU 1036(平均速度 **)
  • 原文地址:https://www.cnblogs.com/wangzhe52xia/p/11404406.html
Copyright © 2011-2022 走看看