前言:想了两个小时orz,最后才想到要用约数个数定理……

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

题目大意:

给定$n,q,A[1],A[2],A[3]$

现有$A[i]=(A[i-1]+A[i-2]+A[i-3])mod q$

求$(\sum_{i=1}^n \prod_{d|i} d^{A_i})mod10007$的值。

$n\leq 300000,q,A[1],A[2],A[3]\leq 10^{16}$。

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

朴素算法是$O(n^2 \log n)$的,就算优化也是$O(n \sqrt n \log n)$,难以承受。

这时,我们注意到:

$ \prod_{d|i} d^{A_i}$

$=(\prod_{d|i} d)^{A_i}$

即$i$的所有因数的乘积的$A_{i}$次方。

我们设$f[i]$表示$i$的约数个数,因为因数是成对出现的,

那么有$\prod_{d|i} d=i^{f[i]/2}$(这里的$/$是计算机意义的)

若$i$为完全平方数,则结果还要乘$\sqrt i$。、

所以最后化简为:

$(\sum_{i=1}^n (i^{f[i]/2})^{A_i})mod10007$ $f[i]=2k$

$(\sum_{i=1}^n (i^{f[i]/2}*\sqrt i)^{A_i})mod10007$ $f[i]=2k+1$

$f[i]$可以用接近于线性的算法求得。时间复杂度$O(n\log n)$。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q,a[],is[],f[],ans,prime[];
bool vis[];
void work()
{
vis[]=vis[]=;
for (int i=;i<=n;i++)
{
if (!vis[i]) prime[++prime[]]=i;
for (int j=;j<=prime[];j++)
{
if (i*prime[j]>n) break;
vis[i*prime[j]]=;
if (!(i%prime[j])) break;
}
}
}
int solve(int now)
{
int t=now,sum=,cnt=;
for (int j=;j<=prime[]&&prime[j]*prime[j]<=t;j++)
{
if (t%prime[j]==){
cnt=;
while(t%prime[j]==) cnt++,t/=prime[j];
sum=sum*(cnt+);
}
}
if (t>) sum<<=;
return sum;
}
int qpow(int a,int b)
{
a%=;
int res=;
while(b)
{
if (b%==) res=(res*a)%;
a=(a*a)%;
b>>=;
}
return res;
}
signed main()
{
cin>>n>>q>>a[]>>a[]>>a[];
work();
for (int i=;i*i<=n;i++) is[i*i]=i;
for (int i=;i<=n;i++)
a[i]=(a[i-]+a[i-]+a[i-])%q;
for (int i=;i<=n;i++){
f[i]=solve(i);
if (is[i]) ans=(ans+qpow(qpow(i,f[i]/)*is[i],a[i]))%;
else ans=(ans+qpow(qpow(i,f[i]/),a[i]))%;
}
cout<<ans;
return ;
}

【FZYZOJ】数论课堂 题解(约数个数定理)的更多相关文章

  1. hdu1492(约数个数定理)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1492 这里先讲一下约数个数定理: 对于正整数x,将其质因分解为 x = pow(p1, a) * po ...

  2. 【搜索】【约数个数定理】[HAOI2007]反素数ant

    对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数. 所以,n以内的反质数即为不超过n的 ...

  3. 【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers

    素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都 ...

  4. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  5. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

    d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...

  6. 数论专项测试——约数个数和(lucas的数论)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  7. UVA - 294 Divisors【数论/区间内约数最多的数的约数个数】

    Mathematicians love all sorts of odd properties of numbers. For instance, they consider to be an int ...

  8. 【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)

    题目: POJ1845 分析: 首先用线性筛把\(A\)分解质因数,得到: \[A=p_1^{a_1}*p_2^{a_2}...*p_n^{a_n} (p_i是质数且a_i>0) \] 则显然\ ...

  9. 牛客:t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数(数论+贪心)

    https://ac.nowcoder.com/acm/contest/907/B t次询问,每次给你一个数n,求在[1,n]内约数个数最多的数的约数个数 分析: 根据约数和定理:对于一个大于1正整数 ...

随机推荐

  1. Django---进阶12

    目录 Auth模块 方法总结 如何扩展auth_user表 项目开发流程 表设计 作业 Auth模块 """ 其实我们在创建好一个django项目之后直接执行数据库迁移命 ...

  2. day12 文件操作(下)

    目录 一.x模式(控制文件操作模式,与rwa同级) 1 特点 2 格式 二.b模式(控制文件读写内容的模式,与t同级) 1.b模式和t模式的区别 2 b模式应用 3 循环读取文件 三.文件操作的其他方 ...

  3. Linux上运行安卓应用:安装使用Anbox

    文章目录 #0x0 简介 #0x1 安装教程 #0x11 第一步,安装需要的内核模块 #0x12 安装Anbox #0x2 使用Anbox #0x21 一些简单的设置 #0x22 安装APK #0x3 ...

  4. Re5ilio 5ync:资源神器

    文章目录 #0x0 简单的介绍 #0x1 安装使用 #0x10 下载 #0x11 安装 #0x12 升级pro权限 #0x13 开始添加资源 #0x14 后续 一定要小心哦!! #0x0 简单的介绍 ...

  5. Pop!_OS下安装C++编程工具

    Pop!_OS下C++编程 #0x0 Visual Studio Code #0x1 C++ 0x11 code::blocks #0x0 Visual Studio Code 下载安装vscode ...

  6. Python 数字格式转换

    # 数字格式转换v1 '''a = input() a1 = list(a) b = ["零", "一", "二", "三&quo ...

  7. 数据可视化之powerBI基础(十八)Power BI度量值的格式如何修改?这里有三种方式

    https://zhuanlan.zhihu.com/p/99818030 ​在知识星球遇到的问题中,有不少朋友问如何修改数值型度量值的格式,比如,新建的度量值如何显示为百分比或者千分位等等,这篇文章 ...

  8. Kafka常用指令

    工作中经常会用到的指令   # 查询topic为test的partition数量 ./kafka-topics.sh --zookeeper localhost:2181/kafka --topic ...

  9. unity-Timeline实践

    前言 建议入门方式(基本的手册知识了解之后):官方Demo TimelineInputDemo 自定义轨迹 CustomTrack Signal 标记 创建Emitter 和 Receiver 引用: ...

  10. C#版本说明

    语言版本 发布时间 .NET Framework要求 Visual Studio版本 C# 1.0 2002.1 .NET Framework 1.0 Visual Studio .NET 2002 ...