bzoj 4407 于神之怒加强版 (反演+线性筛)

于神之怒加强版

Time Limit: 80 Sec  Memory Limit: 512 MB
Submit: 1184  Solved: 535
[Submit][Status][Discuss]

Description

给下N,M,K.求

Input

输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示。

Output

如题

Sample Input

1 2
3 3

Sample Output

20

HINT

1<=N,M,K<=5000000,1<=T<=2000

题解:JudgeOnline/upload/201603/4407.rar

Source

命题人:成都七中张耀楠,鸣谢excited上传。

 1 #include<bits/stdc++.h>
 2 #pragma GCC optimize(2)
 3 #pragma G++ optimize(2)
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<cstdio>
 8 #include<cstring>
 9
10 #define ll long long
11 #define inf 1000000000
12 #define mod 1000000007
13 #define N 5000007
14 using namespace std;
15 inline int read()
16 {
17     int x=0,f=1;char ch=getchar();
18     while(!isdigit(ch)){if(ch==‘-‘)f=-1;ch=getchar();}
19     while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-‘0‘;ch=getchar();}
20     return x*f;
21 }
22
23 int F[N],f[N],flag[N],k,tot,p[N],ans;
24 inline int gpow(int x,int y)
25 {
26     int ans=1;
27     while (y)
28     {
29         if (y&1) ans=(ll)ans*x%mod;
30         y>>=1;x=(ll)x*x%mod;
31     }
32     return ans;
33 }
34 void preparation()
35 {
36     F[1]=1;
37     for (int i=2;i<N;i++)
38     {
39         if (!flag[i]){f[i]=gpow(i,k);F[i]=f[i]-1;p[++tot]=i;}
40         for (int j=1;j<=tot&&i*p[j]<N;j++)
41         {
42             flag[i*p[j]]=1;
43             if (i%p[j])F[i*p[j]]=(ll)F[i]*F[p[j]]%mod;
44             else{F[i*p[j]]=(ll)F[i]*f[p[j]]%mod;break;}
45         }
46     }
47     for (int i=1;i<N;i++) (F[i]+=F[i-1])%=mod;
48 }
49 int main()
50 {
51     int Case=read();k=read();
52     preparation();
53     while (Case--)
54     {
55         int n=read(),m=read();if (n>m) swap(n,m);ans=0;
56         for (int i=1,pos=0;i<=n;i=pos+1)
57         {
58             pos=min(n/(n/i),m/(m/i));
59             (ans+=1LL*(n/i)*(m/i)%mod*(F[pos]-F[i-1])%mod)%=mod;
60         }
61         printf("%d\n",(ans+mod)%mod);
62     }
63     return 0;
64 }

原文地址:https://www.cnblogs.com/fengzhiyuan/p/8530939.html

时间: 2024-10-13 14:43:36

bzoj 4407 于神之怒加强版 (反演+线性筛)的相关文章

bzoj 4407 于神之怒加强版 —— 反演+筛积性函数

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推导如这里:https://www.cnblogs.com/clrs97/p/5191506.html 然后发现 \( F(D) \) 是一个积性函数,可以筛质数的同时筛出来: 首先,单个质数 \( p \) 时只有 \( d=1 \) 和 \( d=p \) 两个因数,所以 \( F[p] = p^{k} - 1 \) 然后如果筛到互质的数,直接把 \( F() \) 相乘即可:

BZOJ 4407 于神之怒加强版

题目链接:于神之怒加强版 这个式子还是很妙的,只是我已经思维僵化了 \begin{aligned} &\sum_{i=1}^n\sum_{j=1}^m\gcd(i,j)^k \\=&\sum_{g=1}^ng^k\sum_{i=1}^{\lfloor \frac{n}{g} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{g} \rfloor}\sum_{d|i,d|j}\mu(d) \\=&\sum_{g=1}^ng^k\sum_{d=1}^{\lflo

●BZOJ 4407 于神之怒加强版

题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4407 题解: 莫比乌斯反演 直接套路化式子 $\begin{align*}ANS&=\sum_{i=1}^{n}\sum_{j=1}^{m}gcd(i,j)^k(接下来先枚举gcd的值g,然后求出有多少对(i,j)的gcd=g) \\&=\sum_{g=1}^{min(n,m)}g^k\sum_{d=1}{\frac{n}{g}\mu(d)\lfloor \frac{n}{gd} \

bzoj 3309 DZY Loves Math——反演+线性筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然后 f( ) 还不能一个就花 log 的时间,所以要分析性质. 设 n 一共 m 个质因数,其中最大的指数是 t . 已有 Σ(d|n) f(d)*u(n/d) ,如果 u( ) 的部分含有指数>=2的质因子,就无贡献:所以 u( ) 里每种质因数选1个或0个,一共 2^m 种. 如果 n 里有一个

【bzoj4407】于神之怒加强版 莫比乌斯反演+线性筛

题目描述 给下N,M,K.求 输入 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上式所示. 输出 如题 样例输入 1 2 3 3 样例输出 20 题解 莫比乌斯反演+线性筛 $\sum\limits_{i=1}^n\sum\limits_{j=1}^m\gcd(i,j)^k\\=\sum\limits_{d=1}^{\min(n,m)}d^k\sum\limits_{i=1}^n\sum\limits

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

题目描述 对于正整数x,定义f(x)为x所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数n,m,求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$ 输入 第一行一个数T,表示询问数.接下来T行,每行两个数n,m,表示一个询问. 输出 对于每一个询问,输出一行一个非负整数作为回答. 样例输入 4 7558588 9653114 6514903 445121

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

BZOJ 2693: jzptab [莫比乌斯反演 线性筛]

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1194  Solved: 455[Submit][Status][Discuss] Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample Input 1 4 5 Sample Output 122 HINT T <= 10000 N, M<=1000000

BZOJ 1968 AHOI2005 COMMON 约数研究 线性筛

题目大意:求n以内所有数的约数个数和 100W,n√n别想了 线性筛可以处理,对于每个数记录最小质因数的次数 令factoral[i]为i的因数个数 cnt[i]为i的最小质因数的次数 若i为质数 则factoral[i]=2 cnt[i]=1 若i%prime[j]!=0 则factoral[prime[j]*i]=factorial[i]*2 cnt[prime[j]*i]=1 若i%prime[j]==0 则factorial[prime[j]*i]=factorial[i]/(cnt[i