• [bzoj2301][HAOI2011]Problem b


    题目大意:给你$a,b,c,d,k(1leqslant a,b,c,d,kleqslant 5 imes10^4)$,求$displaystylesumlimits_{x=a}^bdisplaystylesumlimits_{y=c}^d[(x,y)==k]$

    题解:下文中令$nleqslant m$先考虑求$sumlimits_{i=1}^nsumlimits_{j=1}^m[(i,j)==k]$
    $$
    egin{align*}
    defdsum{displaystylesumlimits}
    令f(p)&=dsum_{i=1}^ndsum_{j=1}^m[(i,j)==p]\
    令F(p)&=dsum_{p|k}f(k)\
        &=dsum_{p|k}dsum_{i=1}^ndsum_{j=1}^m[(i,j)==k]\
        &=dsum_{i=1}^ndsum_{j=1}^m[p|(i,j)]\
        &=leftlfloordfrac{n}{p} ight floorcdot leftlfloordfrac{m}{p} ight floor\
    莫比乌&斯反演得:\
    herefore f(p)&=dsum_{p|k}muBig(dfrac{k}{p}Big)F(k)\
                &=dsum_{i=1}^nmu(i)leftlfloordfrac{n}{ip} ight floorcdotleftlfloordfrac{m}{ip} ight floor\
    end{align*}\
    令g(p)=dsum_{i=1}^pmu(i)\
    然后容斥一下就好了\
    $$

    卡点:


    C++ Code:

    #include <cstdio>
    #define maxn 50010 
    using namespace std;
    int miu[maxn], plist[maxn], ptot;
    bool isp[maxn];
    void sieve(int n) {
    	miu[1] = 1;
    	for (int i = 2; i <= n; i++) {
    		if (!isp[i]) {
    			miu[i] = -1;
    			plist[ptot++] = i;
    		}
    		for (int j = 0; j < ptot, i * plist[j] <= n; j++) {
    			int tmp = i * plist[j];
    			isp[tmp] = true;
    			if (i % plist[j] == 0) {
    				miu[tmp] = 0;
    				break;
    			}
    			miu[tmp] = -miu[i];
    		}
    	}
    	for (int i = 2; i <= n; i++) miu[i] += miu[i - 1];
    }
    inline int min(int a, int b) {return a < b ? a : b;}
    int solve(int n, int m, int k) {
    	n /= k, m /= k;
    	int tmp = min(n, m);
    	int ans = 0, l, r;
    	for (l = 1; l <= tmp; l = r + 1) {
    		r = min(n / (n / l), m / (m / l));
    		ans += (miu[r] - miu[l - 1]) * (n / l) * (m / l);
    	}
    	return ans;
    }
    int Tim, a, b, c, d, k;
    int main() {
    	sieve(50000);
    	scanf("%d", &Tim);
    	while (Tim --> 0) {
    		scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);
    		printf("%d
    ", solve(b, d, k) - solve(a - 1, d, k) - solve(b, c - 1, k) + solve(a - 1, c - 1, k));
    	}
    	return 0;
    }
    
  • 相关阅读:
    HDU 4972 A simple dynamic programming problem
    dd usb 启动盘制作 成功版本
    1233
    openstack kvm 虚拟机磁盘差异衍生
    怎样安装g++/gdb
    区间最小值 线段树 (2015年 JXNU_ACS 算法组暑假第一次周赛)
    hdu
    TCP/IP解析(一):TCP/IP的工作方式
    使用Python生成源文件的两种方法
    zoj1003 Crashing Balloon
  • 原文地址:https://www.cnblogs.com/Memory-of-winter/p/9523943.html
Copyright © 2020-2023  润新知