【JZOJ4782】Math

Description

这里写图片描述

Solution

如果 dij 为奇数,那么 ij 一定是完全平方数。

对于一个 i ,可以表示为pq2 p 无平方因子)。

那么,我们给i乘一个 p ,就是一个平方数。然后我们要再乘一个完全平方数,设它为a,那么就有:

a2pm

化简得: amp

那么对于 i=p 的情况,我们可以直接得出答案为 mi

那么如果有 i=iq2 ,我们的答案还是 mi

那么这些答案可以一次算完,然后筛掉 i ,减少复杂度。

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 10000001
#define ll long long
using namespace std;
bool bz[N];
int main()
{
    int n;
    ll m;
    cin>>n>>m;
    int ans=0;
    fo(i,1,n)
    if(!bz[i])
    {
        int t=sqrt(n/i),q=sqrt(m/i);
        if(q%2) ans-=t;
        else ans+=t;
        fo(j,1,t) bz[i*j*j]=1;
    }
    cout<<ans;
}
posted @ 2016-09-19 20:29  sadstone  阅读(34)  评论(0编辑  收藏  举报