首页 > 其他分享 >欧拉函数与容斥

欧拉函数与容斥

时间:2023-05-31 15:03:46浏览次数:55  
标签:phi 函数 int LL 容斥 因子 num include 欧拉


题目:http://acm.hdu.edu.cn/showproblem.php?pid=1695

 

题意:给定

欧拉函数与容斥_ios

五个数,其中有

欧拉函数与容斥_#include_02


欧拉函数与容斥_ios_03

,求满足条件

欧拉函数与容斥_i++_04

的有序对的个数。题目中     明确说在所有的输入中

欧拉函数与容斥_#include_05



分析:问题可以转化为

欧拉函数与容斥_#include_06


欧拉函数与容斥_ios_07

时,

欧拉函数与容斥_#include_08

的有序对的个数。那么先比较

欧拉函数与容斥_#include_09


欧拉函数与容斥_i++_10


     大小,相同的部分可以用欧拉函数的累加计算,没有公共的部分用容斥计算即可。


     当然,在用容斥计算时,对于每一个数要进行dfs,这样必然会对每一个数进行素因子分解,实际上我们可以对

     每一个数进行线性筛,从而计算出它的所有素因子以及每一个素因子出现的次数,这样预处理时间快很多。


代码:

#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>

using namespace std;
const int N = 100005;
typedef long long LL;

LL phi[N];
int num[N];
int p[N][15];

void Init()
{
    memset(num,0,sizeof(num));
    memset(phi,0,sizeof(phi));
    phi[1] = 1;
    for(int i=2;i<N;i++)
    {
        if(!phi[i])
        {
            for(int j=i;j<N;j+=i)
            {
                if(!phi[j]) phi[j] = j;
                phi[j] = phi[j] - phi[j] / i;
                p[j][num[j]++] = i;
            }
        }
        phi[i] += phi[i-1];
    }
}

LL dfs(int x,int r,int n)
{
    LL ans = 0;
    for(int i=x;i<num[n];i++)
        ans += r / p[n][i] - dfs(i+1,r/p[n][i],n);
    return ans;
}

int main()
{
    Init();
    int tt = 1;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int a,b,k;
        scanf("%d%d%d%d%d",&a,&a,&b,&b,&k);
        if(a > b) swap(a,b);
        if(k == 0)
        {
            printf("Case %d: 0\n",tt++);
            continue;
        }
        a /= k;
        b /= k;
        LL ans = phi[a];
        for(int i=a+1;i<=b;i++)
            ans += a - dfs(0,a,i);
        printf("Case %d: %I64d\n",tt++,ans);
    }
    return 0;
}

 

 

 

 

标签:phi,函数,int,LL,容斥,因子,num,include,欧拉
From: https://blog.51cto.com/u_16146153/6386926

相关文章

  • 关于C++字符串的一些函数
    其实印象里,c的char用法反倒比c++的string深一点,可能是因为我对string的运用太少了吧。 提到C++的string,就得先提一下首先提一下C的char类型,毕竟C++是根据C延展过来的,继承了C的特性,而且C本身是没有string这个东西的。 char是什么?一个关键字,用于声明一个变量是字符类型。好吧,......
  • Python 函数
    函数返回多个返回值defmultiple_return_value():importdatetimed=datetime.date.today()val_1='年份为:{}'.format(d.year)val_2='月份为:{}'.format(d.month)returnval_1,val_2#只需在return关键字后跟多个值(依次用逗号分隔)val=mult......
  • python 中 re.match和re.search()函数
     两者都返回首次匹配字符串的索引,re.match函数只从头开始匹配,re.search函数不限制只从头开始匹配。001、re.match函数[root@PC1test2]#python3Python3.10.9(main,Mar12023,18:23:06)[GCC11.2.0]onlinuxType"help","copyright","credits"or"license"......
  • C/C++杂记:虚函数的实现的基本原理
    1.概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基......
  • C/C++杂记:深入理解数据成员指针、函数成员指针
    1.数据成员指针对于普通指针变量来说,其值是它所指向的地址,0表示空指针。而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始地址的偏移值,空指针用-1表示。例:代码示例:structX{inta;intb;};#defineVALUE_OF_PTR(p)(*(long*)&p)int......
  • 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
    单继承:只有一个基类和一个派生类classBase{public:virtualvoidfun1(){cout<<"Base::func1()"<<endl;}virtualvoidfun2(){cout<<"Base::func2()"<<endl;}private:intb;......
  • hdu 5768 - 中国剩余定理 + 容斥
    题解思路:利用中国剩余定理解决多个同余问题,这里需要再加一项mn=7,an=0,这样才能求出7的倍数的解,然后再需要用到容斥,2^15枚举就行了。1.扩展欧几里得: 我们观察到:欧几里德算法停止的状态是:a=gcd(a,b),b=0,那么,这是否能给我们求解xy提供一种思路呢?因为,这时候,只要a=gc......
  • C++ 在函数内部输出当前类名方式
    开发环境:QtCreator C++1usingnamespacestd;23/*基类汽车*/4classCar5{6public:7Car(){}8virtual~Car(){}9virtualvoidmove(void);10};1112/*基本属性汽车运动*/13voidCar::move(void)14{15cout<<......
  • < Python全景系列-9 > Python 装饰器:优雅地增强你的函数和类
    欢迎来到我们的系列博客《Python全景系列》第九篇!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法。无论你是编程新手,还是有一定基础的开发者,这个系列都将提供你需要的知识和技能。**装饰器在Python中扮演了重要的角......
  • C++多态虚函数表详解(多重继承、多继承情况)
    本文关键词:C++多态多继承多重继承虚函数表虚函数指针动态绑定概述:C++相对其他面向对象语言来说,之所以灵活、高效。很大程度的占比在于其多态技术和模板技术。C++虚函数表是支撑C++多态的重要技术,它是C++动态绑定技术的核心。本文章将着重图解虚函数表相关知识,在阅读本文......