• 【BZOJ2671】Calc 数学


    【BZOJ2671】Calc

    Description

      给出N,统计满足下面条件的数对(a,b)的个数:
      1.1<=a<b<=N
      2.a+b整除a*b

    Input

     一行一个数N

    Output

     一行一个数表示答案

    Sample Input

    15

    Sample Output

    4

    HINT

    数据规模和约定
    N <=2^31-1

    题解:玄学数学题,推导过程不难但很扯,直接上式子:

    设d=gcd(a,b),则$a+b|ab$->$a'd+b'd|a'b'd^2$->$a'+b'|a'b'd$->$a'+b'|d$。

    问题就变成了问你有多少个数对(a,b)满足a与b互质且$(a+b)dle n$,$a+b|d$,又因为d>b所以b最多只能是$sqrt n$。我们将其形式化的写出来:设$m=sqrt n$

    $sumlimits_{b=1}^msumlimits_{a=1}^{b-1}[gcd(a,b)==1]lfloor{nover a+b} floor$

    反演一波$sumlimits_{d=1}^mmu(d)sumlimits_{b=1}^{lfloor {mover d} floor}sumlimits_{a=1}^{b-1}lfloor{nover d^2(a+b)} floor$

    你敢相信。。。推到这就能A了吗?复杂度什么的见鬼去吧~

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int N=100010;
    ll n,m,ans;
    int num;
    int np[N],pri[N],mu[N];
    inline ll calc(int n,int m)
    {
    	ll ret=0;
    	int i,j,t,last;
    	//for(i=1;i<=m;i++)	for(j=1;j<i;j++)	ret+=n/i/(i+j);
    	//return ret;
    	for(i=1;i<=m;i++)
    	{
    		t=n/i;
    		for(j=i+1;j<(i<<1)&&j<=t;j=last+1)
    		{
    			last=min((i<<1)-1,t/(t/j));
    			ret+=1ll*(last-j+1)*(t/j);
    		}
    	}
    	return ret;
    }
    ll gcd(ll a,ll b)
    {
    	return !b?a:gcd(b,a%b);
    }
    int main()
    {
    	scanf("%lld",&n),m=sqrt(n);
    	int i,j;
    	ll last;
    	mu[1]=1;
    	//for(i=1;i<=m;i++)	for(j=1;j<i;j++)	if(gcd(i,j)==1)	ans+=n/i/(i+j);
    	//printf("%lld
    ",ans),ans=0;
    	for(i=2;i<=m;i++)
    	{
    		if(!np[i])	pri[++num]=i,mu[i]=-1;
    		for(j=1;j<=num&&i*pri[j]<=m;j++)
    		{
    			np[i*pri[j]]=1;
    			if(i%pri[j]==0)	break;
    			mu[i*pri[j]]=-mu[i];
    		}
    	}
    	for(i=1;i<=m;i++)	last=calc(n/i/i,m/i),ans+=mu[i]*last;
    	printf("%lld",ans);
    	return 0;
    }
  • 相关阅读:
    添加可运行的js代码
    一,IL访问静态属性和字段
    UI基础UIWindow、UIView
    ASP.NET MVC:会导致锁定的会话
    2013腾讯编程马拉松初赛
    使用phantomjs生成网站快照
    C语言
    设置 Ext.data.Store 传参的请求方式
    HDU 2041 超级楼梯
    MySQL 监控-innotop
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8595763.html
Copyright © 2020-2023  润新知