首页 > 其他分享 >[SDOI2015]约数个数和

[SDOI2015]约数个数和

时间:2022-12-24 09:33:18浏览次数:64  
标签:约数 lfloor frac min sum 个数 rfloor mu SDOI2015

[SDOI2015]约数个数和

https://www.luogu.com.cn/problem/P3327

\(d(x)\)为\(x\)的约数个数,有\(T\)组询问,每次询问

\[\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij) \]

的值.

\(1\leq T,n,m \leq 50000\).

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{j=1}^{m}d(ij)\\ &=\sum_{i=1}^{n}\sum_{j=1}^{m}\sum_{x|i}\sum_{y|j}[\gcd(x,y)=1]\\ &=\sum_{x=1}^{n}\sum_{y=1}^{m}[\gcd(x,y)=1]\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\\ &=\sum_{x=1}^{n}\sum_{y=1}^{m}\sum_{d|x\ and\ d|y}\mu(d)\lfloor\frac{n}{x}\rfloor\lfloor\frac{m}{y}\rfloor\\ &=\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor\lfloor\frac{m}{yd}\rfloor\\ &=\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor \sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{yd}\rfloor\\ \end{aligned} \]

\[f(n)=\sum_{x=1}^{n}\lfloor\frac{n}{x}\rfloor \]

\[f(n)=\sum_{i=1}^{n}d(i) \]

除数函数\(d(n)\)是积性函数,可以\(\Theta(n)\)得到所有\(d(i)\),再处理一下前缀和就可以\(\Theta(1)\)计算\(f(n)\).

所以

\[\begin{aligned} &\sum_{d=1}^{\min(n,m)}\mu(d)\sum_{x=1}^{\lfloor\frac{n}{d}\rfloor}\lfloor\frac{n}{xd}\rfloor \sum_{y=1}^{\lfloor\frac{m}{d}\rfloor}\lfloor\frac{m}{yd}\rfloor\\ &=\sum_{d=1}^{\min(n,m)}\mu(d)f(\lfloor\frac{n}{d}\rfloor)f(\lfloor\frac{m}{d}\rfloor) \end{aligned} \]

时间复杂度\(\Theta(T\sqrt{ \min(n,m)})\).

标签:约数,lfloor,frac,min,sum,个数,rfloor,mu,SDOI2015
From: https://www.cnblogs.com/yanchengzhi/p/17002035.html

相关文章

  • PTA:7-3 统计一行文本的单词个数 c语言最简单代码
    题目本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。样例输入Let'sgotoroom209.样......
  • 好串个数
      常数指令,JAVA2S~3S可以运行10的8次方条常数指令加法、减法、乘法、除法是常数指令链表不是常数指令               ......
  • 54. 【中学】求最大公约数——递归
    54.【中学】求最大公约数——递归 请使用递归算法计算正整数n和m的最大公约数GCD(n,m)。        =m            当m<=n且nmodm......
  • 52.计算子字符串个数
    52.计算子字符串个数(更新测试)字符串匹配问题:输入一个字符串,计算其中包含的连续给定的子字符串的个数(只记录最多)。例如输入字符串"EFABCABCABCDABCDD”,给定子字符......
  • 给定两个数,求这两个数的最大公约数
    1.辗转相除法,一般用来求最大公约数#include<stdio.h>intmain(){intm;intn;intr;printf("请输入两个数:");scanf("%d%d",&m,&n);while(m%n!=0){r=m%n......
  • 质数与约数
    质数与约数质数质数和合数的概念只针对于大于1的整数成立。质数:在大于1的整数中,如果只包含1和本身这两个约数,就被称为质数,或者素数。质数的判定试除法boolis_prim......
  • 使用指针来完成三个数由大到小输出(简单指针的应用)
    #include<stdio.h>intmain(){voidexchange(int*r1,int*r2,int*r3);inta,b,c,*p1,*p2,*p3;scanf("%d%d%d",&a,&b,&c);p1=&a;p2=&b;p3=&c;//若在数组中p1中......
  • 辗转相减法求最大公约数
    要求:用C实现一个函数intgcd(inta,intb)求解两个整数的最大公约数,算法步骤是,用a,b中的大值减去小值得到临时值c,然后再用c和a,b中的最小值进行计算,直到c和a,b中的最......
  • 辗转相除法求最大公约数
    代码#include<stdio.h>intmain(){ inta,b,r,temp; printf("Pleaseentera,b:"); scanf("%d,%d",&a,&b); if(a<b) { temp=a; a=b; b=temp; } r=a%b; ......
  • 输入三个数字,将三个数字按从大到小的顺序输出(两种解法)
    法一:全用if,由于题目只输入输出三个数字,情况较少,可以用if一一罗列出来,即如果a最大、如果b最大、如果c最大的情况#include<stdio.h>intmain(){inta,b,c;printf("请输入......