Math【NOIP2016提高A组模拟9.15】

题目

Math【NOIP2016提高A组模拟9.15】_第1张图片
样例输入:
这里写图片描述
3 5

样例输出:
一行答案。
-1

数据范围:
Math【NOIP2016提高A组模拟9.15】_第2张图片


剖解题目

。。。。。


思路

一脸懵逼。
打了个表找规律,然而脑子愚钝没有找到。。。


解法

30%:暴力。时间 O(n3)
70%:仔细观察发现,只要判断d(n)的奇偶性就行了。当d(n)中n是完全平方数的时候,d(n)就是奇数,道理应该很简单。。。。
所以,我们只需要对于每一个i找到有多少个j使得i*j是完全平方数即可。
i=pq21 ,如果j符合条件,那么 j=pq22 ,那么在m中符合的j的个数就有 mp (下取整)。我们只需要计算出p是多少即可。时间 O(nn)
100%:只需要更快的求出p即可,线筛。时间 O(n) .


代码

#include
#include
#include
#include
#define ll long long
#define fo(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

const int maxn=1e7+5;
ll n,m,ans;
bool bz[maxn];

int main()
{
    freopen("T.in","r",stdin);
    scanf("%lld%lld",&n,&m);
    fo(i,1,n)
    if (!bz[i]){
        int p=1;
        fo(j,2,n){
            if (i*j*j>n) break;
            bz[i*j*j]=true;
            ++p;
        }
        int num=sqrt(m/i);
        if (num%2) ans-=p; else ans+=p;
    }
    printf("%lld",ans);
}

Math【NOIP2016提高A组模拟9.15】_第3张图片

你可能感兴趣的:(信息技术,数学)