zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    C++ 复制控制之复制构造函数
    static关键字总结
    C++ 隐式类类型转换
    Unity 移动端触摸屏操作
    【原创】为什么要用规则引擎?
    【原创】你的Redis怎么持久化的
    【原创】JAVA中令人眼花撩乱的数字魔法
    【原创】谈谈redis的热key问题如何解决
    【原创】Mysql中事务ACID实现原理
    【原创】杂谈自增主键用完了怎么办
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/8595763.html
Copyright © 2011-2022 走看看