数论 + 容斥 - HDU 4059 The Boss on Mars

简介: The Boss on Mars  Problem's Link   Mean:  给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1>=1;            a=a*2;            if(a>n) a%=m;      }      return ...

The Boss on Mars 

Problem's Link


 

Mean: 

给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8)

analyse:

看似简单,倘若自己手动推公式的话,还是需要一定的数学基础.

总的思路:先求出sum1=(1^4)+(2^4)+...(n^4),再求出sum2=(1~n中与n不互质的数的四次方的和),answer=sum1-sum2.

如何求sum1呢?

有两种方法:

  1.数列差分.由于A={Sn}={a1^4+a2^4+...an^4}对应一个五阶线性差分方程,只需要求出这个五阶线性差分方程的系数即可.

  有关数列差分求幂数和通项的知识,click here.

  2.利用低次幂数和来递推高次幂数和公式.

最终求得的公式为:Sn=(n*(n+1)*(2n+1)*(3*n*n+3*n-1))/30.

注意,上式中最后有除法,而我们的最终答案要对1e9+7取余,所以需要求30对1e9+7的模逆元.

由于1e9+7是质数,所以可以直接使用结论:

  a % m = (b/c)%m

  a % m = b * c ^(m-2)%m ( m为素数 )

证明:

    b = a * c % m;

则有:b = a % m * c %m;

根据费马小定理:

   a^(p-1)= 1 %p;(p是素数)

可推出:

   a%m

  = a*1%m = a * c^(m-1)%m

  = a*c*c^(m-2)%m

  = b*c^(m-2)%m;

-------------------------------------------------------------------------

 求sum2时需要用容斥,当然直接容斥暴力统计的话也会超时.

注意到:

    2^4+4^4+6^4+8^4 = 2^4*(1^4+2^4+3^4+4^4) .

所以再求sum2时仍然可以使用幂数求和公式,这样一来时间复杂度就非常低了.

 

Time complexity: O(logn)

 

view code

/*
* this code is made by crazyacking
* Verdict: Accepted
* Submission Date: 2015-10-10-22.47
* Time: 0MS
* Memory: 137KB
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long( LL);
typedef unsigned long long( ULL);
const double eps( 1e-8);

const int MOD = 1000000007;
typedef long long LL;

int cnt = 0;
int a [ 50 ];
LL n , inv;

// prime factor decomposition
void primeFactorization( int n)
{
      cnt = 0;
      for( int i = 2; i * i <=n; i ++)
      {
            if(n % i == 0)
            {
                  a [ cnt ++ ] = i;
                  while(n % i == 0)
                       n /= i;
            }
      }
      if(n > 1) a [ cnt ++ ] =n;
}

LL mulMod( LL a , LL b , LL m)
{
      LL ans = 0;
      while(b)
      {
            if(b & 1)
            {
                  ans = ( ans + a) % m;
                 b --;
            }
           b >>= 1;
            a = a * 2;
            if( a >n) a %= m;
      }
      return ans;
}

LL quickPow( LL a , LL b , LL m)
{
      LL ans = 1;
      while(b)
      {
            if(b & 1)
            {
                  ans = mulMod( ans , a , m);
                 b --;
            }
           b >>= 1;
            a = mulMod( a , a , m);
      }
      return ans;
}
// Exponential sum
LL f( LL n)
{
      LL ans =n;
      ans =( ans *(n + 1)) % MOD;
      ans =( ans *( 2 *n + 1)) % MOD;
      ans =( ans *(( 3 *n *n + 3 *n - 1) % MOD)) % MOD;
      ans =( ans * inv) % MOD;
      return ans;
}

LL solve( LL n)
{
      primeFactorization(n);
      LL ans = 0;
      for( int i = 1; i <( 1 << cnt); i ++)
      {
            LL tmp = 1;
            int tt = 0;
            for( int j = 0; j < cnt; j ++)
            {
                  if(( 1 << j) & i)
                  {
                        tmp = tmp * a [ j ];
                        tt ++;
                  }
            }
            LL q =n / tmp;
            LL t = mulMod( mulMod( tmp , tmp , MOD ), mulMod( tmp , tmp , MOD ), MOD);
            if( tt & 1)
                  ans =( ans + mulMod( f( q ), t , MOD)) % MOD;
            else
                  ans =( ans - mulMod( f( q ), t , MOD) + MOD) % MOD;
      }
      return ans;
}

int main()
{
      int t;
      scanf( "%d" , & t);
      while( t --)
      {
            scanf( "%I64d" , &n);
            if(n == 1)
            {
                  puts( "0");
                  continue;
            }
            inv = quickPow( 30 , MOD - 2 , MOD);
            LL tmp = f(n);
            LL ans = solve(n);
            ans =( tmp - ans + MOD) % MOD;
            printf( "%I64d \n " , ans);
      }
      return 0;
}

 

目录
相关文章
|
XML 存储 前端开发
想要制作沙盒游戏?那么这一款插件你一定不能错过(Unity3D)
今天给大家介绍一款简单而又强大的多人沙盒游戏开发插件VOXL。 VOXL是一款简单且易于理解的多重体素沙盒游戏,使用Unity的UNET网络系统开发。 由于服务器和客户端是一体的,所以我们不用再费心搭建服务器,会大大提高我们的开发效率。 VOXL目前只包含大约2500行干净、优雅和易于理解的源代码。
|
12月前
|
存储 算法 Linux
数据恢复软件恢复的数据打不开的原因与解决方法
数据恢复软件恢复的数据打不开的原因与解决方法
2179 10
|
网络协议 数据库 数据安全/隐私保护
路由与交换利用ENSP模拟器分析和配置中小型企业网络的综合实验(中)
路由与交换利用ENSP模拟器分析和配置中小型企业网络的综合实验
4275 1
路由与交换利用ENSP模拟器分析和配置中小型企业网络的综合实验(中)
|
网络协议 网络虚拟化 数据安全/隐私保护
eNSP常用命令 华为模拟器eNSP常用命令
路由器常用命令:进入任务视图给路由器取名,进入指定接口,给当前路由器接口配置IP地址和子网掩码,退出接口或系统视图,启用DHCP,指定该接口拥有DHCP功能,指定DNS服务器的IP地址,显示全部ip的路由表,显示指定ip路由表,添加静态路由。交换机常用命令:交换机改变语言模式,创建vlan,查看所有vlan,将接口拆分为多个子接口,指定接口与哪个vlan关联,启用arp广播,将接口修改为access接口,将接口修改为trunk接口,将接口划分到指定vlan里,查看开启stp后的交换机接口的接口情况,查看交换
1695 0
eNSP常用命令 华为模拟器eNSP常用命令
|
编解码 人工智能 固态存储
YOLO v2详细解读
《YOLO9000:Better, Faster, Stronger》 Joseph Redmon∗†, Ali Farhadi∗†* University of Washington∗ , Allen Institute for AI*†** 发表时间及期刊:2017 CVPR
YOLO v2详细解读
|
存储 API 区块链
(四)全球数字人民币 CBDC —— e-CNY
关键词:DC/EP、CBDC、e-CNY基础名词CBDC:central bank digital currency —— 中央银行数字货币DC/EP:Digital Currency/Electronic Payment —— 数字货币/电子支付e-CNY:中国的CBDC6个国际CBDC资讯时间:2022-02巴哈马:CBOB,Sand Dollar,沙币加拿大:BOC:加中行,建设中。中国:P
1187 0
(四)全球数字人民币 CBDC —— e-CNY
|
JSON 小程序 Java
Java中解密微信加密数据工具类
当我们开发微信公众号,小程序等,微信返回给我们的数据往往是经过加密的,我们需要使用 sessionKey 配合解密,才能得到我们想要的数据
355 0
|
机器学习/深度学习 安全 搜索推荐
盒马 app iOS 14 Widget 实践
# Widget 简介 Widget 是 iOS 14 重磅推出的新功能,使得用户可以在主屏幕添加小组件,快速浏览 app 提供的重要信息。它的设计与旧版本 macOS 的 Widget 一脉相承,甚至连添加的动画也是去掉了拟物化的水波纹效果。 ![Untitled_design__79_.png](https://intranetproxy.alipay.com/skylark/lark/0
2765 0