五校联考 running (欧拉函数)

题面

\(solution:\)

讲真吧,这道题真的出得,嗯,太恐怖了。考场上这道题真的把我看懵了,这道题以前是见过的,但欧拉函数?我学过吗?一道容斥都要超时的题目,我都要为我自己点根香了,拿着gcd一顿乱搞,果然搞出了个0分。不得不承认博主的数学真的太渣了,但这道题的解题思路真的太妙了(因为渣所以必须学习!)。

首先,一个必须要知道的东西,操场是环形的(即 \((mod\) \(n)\) 意义下的)。若第\(k\)个格子可以被第\(i\)个同学踩到,那么必定存在一个\(x\) 使\(x*a_i\) 在\((mod\) \(n)\)之后等于\(k\) !而这也就相当于:存在一对 \(x\) 和 \(y\) 使得 \(x*a_i-y*n=k\)

而这也就牵扯到我们整除的一些性质了,要满足上面这个式子有整数解,充要条件是 \((a_i,n)|k\) 也就是说所有能被\((a_i,n)\) 整除的格子都可以被第\(i\)位同学踩到!!!可是这样的话,有可能一个格子会被多个同学踩到,我们怎么去重呢?

我们发现产生重复的原因是我们的充要条件即 \((a_i,n)|k (i\in m)\) ,有可能存在多个$i \(能使条件成立,并存在多个\)i\(使它们的\)(a_i,n)$ 存在公因数,然后我们考虑如何让重复的情况只出现一次:就是枚举\(n\)的约数(把\((a_i,n)\)所有可能的值枚举一遍),枚举并判断它是否有贡献之后我们不算存在多少\(k\)可以整除它,我们只算有多少\((k,n)\)能等于它。(因为我们枚举的\(n\)的约数会包括它的倍数,当下我们只算好它的贡献!)

我们把枚举的约数定为\(d\),那我们就只要求有多少个\(k\),使\((k,n)=d\),也就是求有多少个\(k\),使\((\frac{k}{d} ,\frac{n}{d})=1\)也就是求欧拉函数了。

\(code:\)

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>

#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int

using namespace std;

int n,m,top,ans;
int a[55];
int b[100005];

inline int qr(){
    char ch;
    while((ch=getchar())<'0'||ch>'9');
    int res=ch^48;
    while((ch=getchar())>='0'&&ch<='9')
        res=res*10+(ch^48);
    return res;
}

inline int gcd(int x,int y){
    if(!y)return x;
    return gcd(y,x%y);
}

inline int phi(int x){//单独求欧拉函数
    int y=x;
    for(rg i=2;i<=top&&x>1;++i){
        if(!(x%b[i]))y=y/b[i]*(b[i]-1);
        while(!(x%b[i]))x/=b[i];
    }return y;
}

int main(){
    //freopen("running.in","r",stdin);
    //freopen("running.out","w",stdout);
    ans=n=qr(),m=qr();
    for(rg i=1;i<=m;++i)a[i]=qr();
    for(rg i=1;i<=sqrt(n);++i)
        if(n%i==0)b[++top]=i,b[++top]=n/i;//枚举所有约数
    sort(b+1,b+top+1);
    for(rg i,k=1;k<=top;++k){
        i=b[k];
        for(rg j=1;j<=m;++j)
            if(i%gcd(a[j],n)==0)//如果这个约数有贡献(即存在一个人使得(ai,n)|k)
                {ans-=phi(n/i);break;}
    } printf("%d\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/812-xiao-wen/p/10357943.html

时间: 2024-11-15 06:25:11

五校联考 running (欧拉函数)的相关文章

【NOIP2016提高A组五校联考4】label

题目 题目 20%算法 设\(f_{i,j}\)表示第i个节点选了j这个权值的方案数. 显然转移方程为,\[f_{i,j}=\Pi_{v=son(i)}(\sum_{k=1}^{j-k}f_{v,k}+\sum_{k=j+k}^{m}f_{v,k})\] 40%算法 接着上面的想法, 观察转移方程,发现,求和部分其实是两段连续的,那么将\(f_{i}\)求一个前缀和. 100%算法 观察\(f\)数组,发现其实\(f\)是对称的,而且中间的一段是相同的,设深度为x,那么前面就有\((x-1)k\

【NOIP2016提高A组五校联考4】ksum

题目 分析 发现,当子段[l,r]被取了出来,那么[l-1,r].[l,r+1]一定也被取了出来. 那么,首先将[1,n]放入大顶堆,每次将堆顶的子段[l,r]取出来,因为它是堆顶,所以一定是最大的子段,输出它,并将[l+1,r]和[l,r-1]放进堆中. 一共就只用做k次就可以了. #include <cmath> #include <iostream> #include <cstdio> #include <cstdlib> #include <c

NOIP2016提高A组五校联考4总结

坑爹的第一题,我居然想了足足3个小时,而且还不确定是否正确. 于是,我就在这种情况下心惊胆跳的打了,好在ac了,否则就爆零了. 第二题,树形dp,本来差点就想到了正解,结果时间不够,没打完. 第三题,比赛上直接弃疗. 感想 首先强烈谴责出题人,输入开了10^6,我打了读入优化还调了半天才过,什么坑爹的题啊! 本来第一题是个水题,但是我却想了那么久,可能是因为我的基础打得不够扎实,基础训练不够,光顾着学习更高深的算法却忽略的基础的知识. 原文地址:https://www.cnblogs.com/c

【NOIP2016提高A组五校联考4】square

题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\) 接着,再设\(g_{i,j,k,l}\)表示在以\((k,l)\)为左上角,\((k+2^i-1,l+2^j-1)\)为右下角的矩阵中,最大的f. 二维rmq就不讲了. 假设询问矩阵(x,y,x1,y1), 二分答案ans(想想为什么?) 用rmq看红色区域中的最大f值是否合法. 注意:出题人将

hihoCoder 1298 : 数论五&#183;欧拉函数

#1298 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数

数论五&#183;欧拉函数

#1298 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数

hihoCoder 数论五&#183;欧拉函数

题目1 : 数论五·欧拉函数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho有时候会用密码写信来互相联系,他们用了一个很大的数当做密钥.小Hi和小Ho约定了一个区间[L,R],每次小Hi和小Ho会选择其中的一个数作为密钥. 小Hi:小Ho,这次我们选[L,R]中的一个数K. 小Ho:恩,小Hi,这个K是多少啊? 小Hi:这个K嘛,不如这一次小Ho你自己想办法算一算怎么样?我这次选择的K满足这样一个条件: 假设φ(n)表示1..n-1中与n互质的数的个

算法复习——欧拉函数(poj3090)

题目: Description A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), other than the origin, is visible from the origin if the line from (0, 0) to (x, y) does not pass through any other lattice point. For exa

hdu (欧拉函数+容斥原理) GCD

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1695 看了别人的方法才会做 参考博客http://blog.csdn.net/shiren_Bod/article/details/5787722 题意 a,b,c,d,k五个数,a与c可看做恒为1,求在a到b中选一个数x,c到d中选一个数y,使得gcd(x,y)等于k,求x和y有多少对. 首先可以想到选取的必是k的倍数,假设是x和y倍,则x和y一定是互质的在,那么就变成了求1到b/k和1到d/k的之