省赛i题/求1~n内所有数对(x,y),满足最大公约数是质数的对数

求1~n内所有数对(x,y),gcd(x,y)=质数,的对数。

思路:用f[n]求出,含n的对数,最后用sum【n】求和。

对于gcd(x,y)=a(设x<=y,a是质数),则必有gcd(x/a,y/a)=1;所以我只要枚举i(设i=y/a),再枚举所有质数

他们乘积的f[i*a]值包括i的欧拉函数值。时间复杂度(n*质数个数)

#include<iostream>
#include<cstring>
using namespace std;
const int maxx=100010;
int mindiv[maxx+5],phi[maxx+5];
void genphi()                  //求出1~n内所有数的欧拉函数值
{
    for(int i=1; i<=maxx; i++)
    {
        mindiv[i]=i;
    }
    for(int i=2; i*i<=maxx; i++)      //筛法
    {
        if(mindiv[i]==i)
        {
            for(int j=i*i; j<=maxx; j+=i)
            {
                mindiv[j]=i;
            }
        }
    }
    phi[1]=1;
    for(int i=2; i<=maxx; i++)
    {
        phi[i]=phi[i/mindiv[i]];
        if((i/mindiv[i])%mindiv[i]==0)
        {
            phi[i]*=mindiv[i];
        }
              else
        {
            phi[i]*=mindiv[i]-1;
        }
    }
}
int pri[maxx+5];
int nump=0;  //素数个数
int pp[maxx+5];    //存素数
void  getp()
{
    for(int i=2;i<=maxx;i++)
    {
       while(i<=maxx&&pri[i])i++;
        pp[nump++]=i;
        for(int j=i*2;j<=maxx;j=j+i)
                pri[j]=1;
    }
}
long long f[maxx+5];
long long sum[maxx+5];
int main()
{
    getp();
   genphi();
    for(int i=1;i<=maxx;i++)     //  枚举每个i,i=y/pp[j]()
    {
        for(int j=0;j<nump&&i*pp[j]<=maxx;j++)   //枚举所有质数
        {
            if(i!=1)                             //(a,b)(b,a)算俩次。
             f[i*pp[j]]+=phi[i]*2;
           else  f[i*pp[j]]+=phi[i];
        }
    }
    long long tsum=0;
    for(int i=1;i<=maxx;i++)
   {
       tsum+=f[i];
       sum[i]=tsum;
   }
   int n;
   while(cin>>n)
   {
       cout<<sum[n]<<endl;
   }

}

省赛i题/求1~n内所有数对(x,y),满足最大公约数是质数的对数

时间: 2024-10-13 18:05:06

省赛i题/求1~n内所有数对(x,y),满足最大公约数是质数的对数的相关文章

hdu 5053 (2014上海网赛L题 求立方和)

题目大意:给你L到N的范围,要求你求这个范围内的所有整数的立方和. Sample Input2 //T1 32 5 Sample OutputCase #1: 36Case #2: 224 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # define LL long l

hdu 5443 (2015长春网赛G题 求区间最值)

求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 22 33 3 Sample Output1002344519999999999991 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm>

2017乌鲁木齐区域赛K(容斥原理【求指定区间内与n互素的数的个数】)

#include<bits/stdc++.h>using namespace std;const long long mod = 998244353;typedef const long long ll;vector<long long>p;long long inv(long long x,long long y)//快速幂求逆元模板(以乘代除){    long long r=1;    while(y>0)    {        if(y&1)        

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

Sdut 2108 Alice and Bob(数学题)(山东省ACM第四届省赛D题)

题目地址:sdut 2608 Alice and Bob Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*....

sdut 2603 Rescue The Princess(算是解析几何吧)(山东省第四届ACM省赛A题)

题目地址:sdut 2603 Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess

sdut 2416:Fruit Ninja II(第三届山东省省赛原题,数学题)

Fruit Ninja II Time Limit: 5000MS Memory limit: 65536K 题目描述 Have you ever played a popular game named "Fruit Ninja"?Fruit Ninja (known as Fruit Ninja HD on the iPad and Fruit Ninja THD for Nvidia Tegra 2 based Android devices) is a video game de

sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a beast caught a beautiful princess and the princess was put in prison. To rescue the princess, a prince who wanted to marry the princess set out immedia

HDU 4791 Alice&#39;s Print Service(2013长沙区域赛现场赛A题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3...表示打印区间s1到s2张纸的单价是p1,打印区间s2 到s3的单价是p2....最后是sn到无穷大的单价是pn,让你求打印k张纸的总费用最少是多少?有m次查询. 因为s1*p1 > s2 * p2 > s3*p3......,很显然,加入k所在的那个区间是第x个区间,那么最低费用要么是k * p