【XSY2903】B 莫比乌斯反演

题目描述

  有一个\(n\times n\)的网格,除了左下角的格子外每个格子的中心里都有一个圆,每个圆的半径为\(R\),问你在左下角的格子的中心能看到多少个圆。

  \(n\leq {10}^9,R_0\leq {10}^6,R=\frac{R_0}{{10}^6}\)

题解

  先枚举格子,判断是否能看到。

  显然能看到就一定能看到圆的中心。

  条件是:
\[ \begin{align} \frac{\lvert Ax+By\rvert}{\sqrt{A^2+B^2}}&\leq R\\\ \lvert Ax+By\rvert&\leq R\sqrt{A^2+B^2}\\\ {(Ax+By)}^2&\leq R^2(A^2+B^2)\\\ \frac{{(Ax+By)}^2}{A^2+B^2}&\leq R^2\\ \end{align} \]
  如果\(\gcd(a,b)\neq 1\),那么一定会被挡住。

  否则一定存在\(x,y,s.t.ax+by=1\)
\[ \begin{align} \frac{1}{A^2+B^2}&\leq R^2\\ A^2+B^2&\geq \frac{1}{R^2} \end{align} \]
  那么现在我们要求的就是
\[ \begin{align} &\sum_{i=1}^n\sum_{j=1}^n[\gcd(i,j)=1][i^2+j^2<R^2]\\ =&\sum_{d=1}^n\mu(d)\sum_{1\leq i,j\leq \frac{n}{d}}[i^2+j^2<\frac{R^2}{D^2}] \end{align} \]
  时间复杂度:\(O(\frac 1R\log \frac 1R)\)

题解

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<cmath>
#include<functional>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
void sort(int &a,int &b)
{
    if(a>b)
        swap(a,b);
}
void open(const char *s)
{
#ifndef ONLINE_JUDGE
    char str[100];
    sprintf(str,"%s.in",s);
    freopen(str,"r",stdin);
    sprintf(str,"%s.out",s);
    freopen(str,"w",stdout);
#endif
}
int rd()
{
    int s=0,c;
    while((c=getchar())<'0'||c>'9');
    do
    {
        s=s*10+c-'0';
    }
    while((c=getchar())>='0'&&c<='9');
    return s;
}
void put(int x)
{
    if(!x)
    {
        putchar('0');
        return;
    }
    static int c[20];
    int t=0;
    while(x)
    {
        c[++t]=x%10;
        x/=10;
    }
    while(t)
        putchar(c[t--]+'0');
}
int upmin(int &a,int b)
{
    if(b<a)
    {
        a=b;
        return 1;
    }
    return 0;
}
int upmax(int &a,int b)
{
    if(b>a)
    {
        a=b;
        return 1;
    }
    return 0;
}
ll ans;
ll calc(ll n,ll r)
{
    ll j=0;
    while(j<n&&(j+1)*(j+1)<=r)
        j++;
    ll s=0;
    for(int i=1;i<=n&&(ll)i*i<=r;i++)
    {
        while((ll)i*i+j*j>r)
            j--;
        s+=j;
    }
    return s;
}
int miu[1000010];
int b[1000010];
int pri[1000010];
int cnt;
int main()
{
    open("b");
    ll n,r;
    scanf("%lld%lld",&n,&r);
    r=(ll)1e12/r/r;
    miu[1]=1;
    n--;
    for(int i=2;i<=1000000;i++)
    {
        if(!b[i])
        {
            pri[++cnt]=i;
            miu[i]=-1;
        }
        for(int j=1;j<=cnt&&i*pri[j]<=1000000;j++)
        {
            b[i*pri[j]]=1;
            if(i%pri[j]==0)
                break;
            miu[i*pri[j]]=-miu[i];
        }
    }
    for(int i=1;(ll)i*i<=r;i++)
        if(miu[i])
            ans+=miu[i]*calc(n/i,r/i/i);
    ans+=2;
    printf("%lld\n",ans);
    return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/9045627.html

根据提供的引用内容,你遇到的问题是在发送HTTP POST请求时收到了403 Forbidden的错误。这个错误通常表示你没有权限访问所请求的资源。 要解决这个问题,你可以采取以下步骤: 1. 首先,确保你的请求URL正确,并且你有权限访问该URL。你可以尝试在浏览器中直接访问该URL,看看是否能够成功访问。 2. 如果你确定URL是正确的,并且你有权限访问,那么可能是你的请求中缺少了必要的身份验证信息。你可以检查你的请求头中是否包含了正确的身份验证信息,比如Token或用户名密码。 3. 另外,你还可以检查服务器端的配置,确保你的请求被正确地处理和授权。你可以查看服务器的日志,以了解更多关于403错误的详细信息。 综上所述,当你收到403 Forbidden错误时,你应该首先检查URL和权限,然后确保请求中包含了正确的身份验证信息。如果问题仍然存在,你可以进一步检查服务器端的配置和日志,以找出问题的根本原因。 #### 引用[.reference_title] - *1* [kubeadm init报错10248...(The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ failed)](https://blog.csdn.net/weixin_45969972/article/details/123529966)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [c/c++使用libcurl库做http客户端及封装(HTTP_GET和HTTP_POST)](https://blog.csdn.net/xsy29000/article/details/103181267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值