bzoj 2693

收获:

  1、积性函数的积也是积性函数,基本的积性函数:常数函数,正比例函数,欧拉函数,Mobius函数,积性函数一般都知道表达式,所以一般都可以在线性筛时搞定。

  2、遇到整除求和时,这个东西就已经是最简了,所以可以考虑提出它,然后尝试搞后边的东西的前缀和,如果可以成功,那么就可以在O(sqrt(n))的复杂度做了。

 1 /**************************************************************
 2     Problem: 2693
 3     User: idy002
 4     Language: C++
 5     Result: Accepted
 6     Time:4692 ms
 7     Memory:118504 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <iostream>
12 #define M 100000009
13 using namespace std;
14
15 typedef long long dnt;
16
17 int prm[10010], isnot[10000010], mu[10000010], dm[10000010], ptot;
18
19 void init( int n ) {
20     mu[1] = 1;
21     dm[1] = 1;
22     for( int i=2; i<=n; i++ ) {
23         if( !isnot[i] ) {
24             prm[++ptot] = i;
25             mu[i] = -1;
26             dm[i] = (dnt)i*(1-i) % M;
27         }
28         for( int j=1; j<=ptot && i*prm[j]<=n; j++ ) {
29             int k = i*prm[j];
30             isnot[k] = true;
31             if( i%prm[j]==0 ) {
32                 mu[k] = 0;
33                 dm[k] = (dnt)k/i*dm[i] % M;
34                 break;
35             }
36             mu[k] = -mu[i];
37             dm[k] = (dnt)dm[i]*dm[prm[j]] % M;
38         }
39     }
40     for( int i=1; i<=n; i++ ) {
41         dm[i] += dm[i-1];
42         if( dm[i]>=M ) dm[i]-=M;
43         if( dm[i]<0 ) dm[i]+=M;
44     }
45 }
46 inline dnt S( dnt n, dnt m ) {
47     return ((1+n)*n/2%M) * ((1+m)*m/2%M) % M;
48 }
49 dnt calc( int n, int m ) {
50     if( n>m ) swap(n,m);
51     dnt rt = 0;
52     for( dnt d=1; d<=n; d++ ) {
53         dnt dd = min( n/(n/d), m/(m/d) );
54         rt += S(n/d,m/d) * (dm[dd]-dm[d-1]) % M;
55         if( rt>=M ) rt-=M;
56         if( rt<0 ) rt+=M;
57         d = dd;
58     }
59     return rt;
60 }
61 int main() {
62     init(10000000);
63     int T;
64     scanf( "%d", &T );
65     while( T-- ) {
66         int n, m;
67         scanf( "%d%d", &n, &m );
68         printf( "%lld\n", calc(n,m) );
69     }
70 }

时间: 2024-07-29 01:56:14

bzoj 2693的相关文章

【莫比乌斯反演】关于Mobius反演与lcm的一些关系与问题简化(BZOJ 2154 crash的数字表格&amp;&amp;BZOJ 2693 jzptab)

BZOJ 2154 crash的数字表格 Description 今天的数学课上,Crash小朋友学习了最小公倍数(Least Common Multiple).对于两个正整数a和b,LCM(a, b)表示能同时被a和b整除的最小正整数.例如,LCM(6, 8) = 24.回到家后,Crash还在想着课上学的东西,为了研究最小公倍数,他画了一张N*M的表格.每个格子里写了一个数字,其中第i行第j列的那个格子里写着数为LCM(i, j).一个4*5的表格如下: 1 2 3 4 5 2 2 6 4

BZOJ 2693 jzptab 【莫比乌斯反演】

Description Hint T <= 10000 N, M<=10000000 Solution 和 BZOJ 2154 数字表格 几乎一样,只不过询问变成多组,之前的复杂度又过不了了 依旧写开答案 又有两个枚举量 我们尝试改变求和指标+前缀和继续减掉一个枚举量 于是就有了 对于这个东西我们定义它为 h ( D ) 使可以进行前缀和预处理的 考虑枚举 i 和 i 的倍数 然而这样的处理显然也是接受不了的 似乎只有O(n)的复杂度才可能接受 能不能把 h 放到线性筛之中处理出来呢 对于一个

bzoj 2693: jzptab 线性筛积性函数

2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[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<=10000000

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 2693 jzptab

http://www.lydsy.com/JudgeOnline/problem.php?id=2693 题解: 考虑把lcm转化成gcd那答案就是然后神奇的设:就有:一样可以枚举 的取值,这是O(√n)的: 然后求f(x,y): 大概证明了一下= = 线性筛之后也可以O(√n)求出f(x,y)总复杂度O(n),常数略大.. 这题显然是卡O(n)过不了呗那就还得优化 预处理这玩意 然后O(√n)就搞出来啦! 设“积性函数的约数和也是积性函数”  ->好像比较显然?所以g(D)是积性函数线性筛裸上

BZOJ 2693: jzptab( 莫比乌斯反演 )

速度居然#2...目测是因为我没用long long.. 求∑ lcm(i, j) (1 <= i <= n, 1 <= j <= m) 化简之后就只须求f(x) = x∑u(d)*d (d | x) 然后就是分块了... ------------------------------------------------------------------- #include<bits/stdc++.h> using namespace std; typedef long

Crash的数字表格 BZOJ 2154 / jzptab BZOJ 2693

jzptab [问题描述] 求: 多组询问 [输入格式] 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M [输出格式] T行 每行一个整数 表示第i组数据的结果 [样例输入] 1 4 5 [样例输出] 122 [数据范围] T <= 10000 N, M<=10000000 题解: 即后面那个部分为 H[T],H[T]是积性函数,求详细证明的话将T和d展开为质因数次幂相乘的形式,考虑线性筛中枚举的质数与被筛数的性质即可 1 #include<cmath> 2 #i

【BZOJ】【2693】JZPTAB

莫比乌斯反演 PoPoQQQ讲义第5题,是BZOJ 2154的升级版(多次询问) 题解:http://blog.csdn.net/popoqqq/article/details/42078725 WA:应该输出(ans+P)%P……而不是ans 1 /************************************************************** 2 Problem: 2693 3 User: Tunix 4 Language: C++ 5 Result: Accep

Mobius 反演

上次看莫比乌斯繁衍反演是一个月前,讲道理没怎么看懂.. 然后出去跪了二十天, 然后今天又开始看发现其实并不难理解 开个这个仅记录一下写过的题. HAOI 2011 B 这应该是莫比乌斯反演的模板题,有很多题解,不多说. CODE: //HAOI 2011 B //by Cydiater //2016.7.25 #include <iostream> #include <cstring> #include <string> #include <algorithm&g