2627: JZPKIL

题意:求

\[\sum_{i=1}^n (n,i)^x [i,n]^y,\ [i,n] = lcm(i,n)
\]

\(n \le 10^{18},\ x,y\le 3000\)


本题带来了一种新技巧,n太大,转化成一个积性函数然后求这个积性函数,质因子分解利用积性,这养只与质因子的数量和指数有关


官方题解清橙上有


首先套路推♂倒

\[n^y \sum_{d \mid n} d^x \sum_{e \mid \frac{n}{d}} \mu(e) e^y \sum_{i=1}^{\frac{n}{de}} i^{y+1-k} \\
\]

这里使用\(D=de\)然后整除分块并不好做

代入伯努利数,交换求和顺序

\[\frac{n^y}{y+1} \sum_{k=0}^y \binom{y+1}{k} B_k^+ \sum_{d \mid n} d^x \sum_{e \mid \frac{n}{d}} \mu(e) e^y \sum_{i=1}^{\frac{n}{de}} i^{y+1-k} \\
\]

后面那块就是\((id^x *( (\mu \cdot id^y) * id^z)(n) = ( (\mu \cdot id^y) * id^x * id^z)(n)\)

考虑求这个积性函数

用Pollard-rho质因子分解n,然后求

\(( (\mu \cdot id^y) * id^x * id^z)(p^c)\)

这个很好求,\(\mu\)那里只能是\(1,p\),剩下的直接\(O(c)\)计算就行了


质因子个数和指数都是log级的,所以复杂度大约是\(O(y^2 + n^{\frac{1}{4}}logn+ylog^2n)\)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N = 3005, P = 1e9+7, mo = P, inv2 = (P+1)/2;
inline int read(){
char c=getchar(); int x=0,f=1;
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x*f;
} namespace qwq {
ll mul(ll a, ll b, ll P) {
ll t = (a * b - (ll) ((long double) a / P * b + 0.5) * P);
return t<0 ? t+P : t;
}
ll Pow(ll a, ll b, ll P) {
ll ans = 1; a %= P;
for(; b; b>>=1, a = mul(a, a, P))
if(b&1) ans = mul(ans, a, P);
return ans;
}
bool witness(ll a, ll n, ll u, int t) {
ll x = Pow(a, u, n), y = x;
while(t--) {
x = mul(x, x, n);
if(x == 1 && y != 1 && y != n-1) return true;
y = x;
}
return x != 1;
}
int p[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23};
bool m_r(ll n) {
if(n == 2) return true;
if(n <= 1 || ~n&1) return false;
ll u = n-1, t = 0;
while(~u&1) u >>= 1, t++;
for(int i=0; i<9; i++) {
if(p[i] == n) return true;
if(witness(p[i], n, u, t)) return false;
}
return true;
}
ll gcd(ll a, ll b) {return !b ? a : gcd(b, a%b);}
ll _rho(ll n, ll c) {
int k = 2; ll x = rand()%n, y = x, d = 1;
for(int i=1; d==1; i++) {
x = (mul(x, x, n) + c) %n;
d = gcd(n, x>y ? x-y : y-x);
if(i == k) y = x, k <<= 1;
}
return d;
}
ll d[N];
void p_r(ll n) {
if(n == 1) return;
if(m_r(n)) {d[++d[0]] = n; return;}
ll t = n;
while(t == n) t = _rho(n, rand() % (n-1) + 1);
p_r(t); p_r(n/t);
}
} using qwq::d; ll Pow(ll a, ll b) {
ll ans = 1; a %= P;
for(; b; b>>=1, a=a*a%P)
if(b&1) ans=ans*a%P;
return ans;
} int b[N];
ll inv[N], fac[N], facInv[N];
inline ll C(int n, int m) {return fac[n] * facInv[m] %P * facInv[n-m] %P;}
void init(int n) {
inv[1] = fac[0] = facInv[0] = 1;
for(int i=1; i<=n+1; i++) {
if(i != 1) inv[i] = (P - P/i) * inv[P%i] %P;
fac[i] = fac[i-1] * i %P;
facInv[i] = facInv[i-1] * inv[i] %P;
} b[0] = 1; b[1] = P-inv2;
for(int m=2; m<=n; m++) if(!(m&1)) {
for(int k=0; k<=m-1; k++) b[m] = (b[m] - C(m+1, k) * b[k]) %P;
b[m] = b[m] * Pow(C(m+1, m), P-2) %P;
if(b[m] < 0) b[m] += P;
}
b[1] = inv2;
} struct meow{ll p; int k;} a[N]; int m; ll p1[N], p2[N];
void solve(ll n, int x, int y) {
d[0] = 0; qwq::p_r(n); sort(d+1, d+d[0]+1);
m = 0; a[++m] = (meow){d[1], 1};
for(int i=2; i<=d[0]; i++) {
if(d[i] == d[i-1]) a[m].k++;
else a[++m] = (meow){d[i], 1};
}
//for(int i=1; i<=m; i++) printf("factor %d %lld %d\n", i, a[i].p, a[i].k); ll ans = 0;
for(int k=0; k<=y; k++) {
ll t = C(y+1, k) * b[k] %mo;
int z = y + 1 - k;
for(int i=1; i<=m; i++) {
ll p = a[i].p, t1 = 0, t2 = 0;
int c = a[i].k;
p1[0] = 1; ll u = p1[1] = Pow(p, x);
p2[0] = 1; ll v = p2[1] = Pow(p, z);
for(int j=2; j<=c; j++) p1[j] = p1[j-1] * u %mo, p2[j] = p2[j-1] * v %mo;
for(int j=0; j<=c; j++) t1 = (t1 + p1[j] * p2[c-j]) %mo;
for(int j=0; j<c; j++) t2 = (t2 + p1[j] * p2[c-1-j]) %mo;
t2 = (mo - Pow(p, y)) * t2 %mo;
t = t * (t1 + t2) %mo;
}
ans = (ans + t) %mo;
}
ans = ans * Pow(n, y) %mo * Pow(y+1, mo-2) %mo;
printf("%lld\n", ans);
} int x, y; ll n; int main() {
freopen("in", "r", stdin);
init(3001);
int T = read();
while(T--) {
scanf("%lld", &n); x = read(); y = read();
solve(n, x, y);
}
}

bzoj 2627: JZPKIL [伯努利数 Pollard-rho]的更多相关文章

  1. BZOJ 2627 JZPKIL

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2627 题意:计算下面式子 思路: A先不管.我们来搞B部分.下面说如何计算B这个最 ...

  2. Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法

    BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1044  Solved: 322[Submit][ ...

  3. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  4. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

  5. 整数(质因子)分解(Pollard rho大整数分解)

    整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...

  6. Pollard Rho因子分解算法

    有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...

  7. 初学Pollard Rho算法

    前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...

  8. 【Luogu】P4358密钥破解(Pollard Rho)

    题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...

  9. BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数

    BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数 Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sa ...

随机推荐

  1. Tomcat服务器的下载及安装

    Tomcat服务器的下载及安装 1)到apache官网.www.apache.org     http://jakarta.apache.org(产品的主页) 2) 安装版:window (exe.m ...

  2. 从零开始学习前端开发 — 18、BFC

    一. BFC的概念 BFC--block formating context的缩写,中文译为"块级格式化上下文" 二.如何触发BFC 1.设置float除none以外的值(left ...

  3. 7系列高速收发器总结 GTP IP核使用篇

    上一篇7系列收发器博文讲解了GTP IP核的基本配置,本文继续分析如何将它使用起来.生成IP核后打开example design,先看看工程中包含的文件结构. 顶层文件下包含了gtp ip核系统顶层文 ...

  4. Codeforces 900C Remove Extra One 模拟

    题目链接:900C Remove Extra One 题意: 首先record是指这个数比数列前面的所有数都大,给了n个数(1-n),删掉一个数,让整个数列的record值达到最大. 题解: 刚开始我 ...

  5. Jpa 本地方式实现数据的持久化【千锋】

    Jpa本身支持多种方式的对象持久化,比如数据库方式,还有一种方式就是本地文件的方式,本文来讲解以本地方式实现的数据持久化,具体的资源大家可以参阅一下网站:http://www.objectdb.com ...

  6. C# 获取ListView中选中行中对应的列数据

    C# 获取ListView中选中行中对应的列数据 ) { ListView.SelectedIndexCollection c = MediaList.SelectedIndices; ]].SubI ...

  7. nginx中支持.htaccess并禁止php在特定目录无法运行

    在nginx.conf中的server里面 include /yjdata/www/thinkphp/.htaccess; 在对应的目录下面创建.htaccess,并填写以下内容,(image是跟目下 ...

  8. JVM-垃圾收集的过程

    JDK1.7 JVM的垃圾收集算法有 1. 标记-清除算法: 2. 复制算法:在商业虚拟机都是使用这种算法来回收新生代的 3. 标记-整理算法: JDK1.7 JVM的垃圾收集器有 1. Serial ...

  9. mybatis实战教程三:mybatis和springmvc整合

    一.搭建maven环境,引入相关jar 参考demo 二.写web.xml <?xml version="1.0" encoding="UTF-8"?&g ...

  10. form表单action=""的作用

    看项目时发现action="",可仍旧提交到后台相关页面了.查了一下,action=""相当于当前页面刷新,不过页面按照form表单提交参数到后台@参考文章