POJ 3696 欧拉函数+快速幂
题目的意思大概就是问是否存在一串全是8的数字是L的倍数
直接想没有什么想法,要想到用简洁的形式将这个数字表示出来,对于每一位都是8的数字我们可以用
X=8*(10k-1)/9的形式表示出来,那么题目的意思就是求X使L|X,我们先处理一下8和L,即除去他们的最大公约数,然后就是L’|(10k-1)/9,即就是10k-1|9L’我们用L’'表示9L’
问题就转化成了要求10k-1%L’’==0,10k=1(mod L’’)(其实找的是在模L’'剩余系中10的阶)
如果10和L’'不互质那么10没有阶
由欧拉定理我们得知,10f(L’’)=1(mod L’’),因此阶一定是f(L’’)的因子,其中f(n)代表的是n的欧拉函数,因此我们从小到大查找欧拉函数值的所有因子直到找到阶
在这种思路下有如下代码
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<ctime>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;ll L;ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);
}ll phi(ll x)
{ll ret=1;for(ll i=2;i*i<=x;i++){if(x%i==0){ret*=(i-1);x/=i;while(x%i==0){ret*=i;x/=i;}}if(x==1) break;}if(x>1) ret*=(x-1);return ret;
}ll mult(ll a,ll b,ll t)
{a%=t; b%=t;ll ret=0;while(b){if(b&1){ret+=a; if(ret>t) ret-=t;}a<<=1; b>>=1;if(a>t) a-=t;}return ret;
}ll quick_pow(ll a,ll b,ll t)
{ll ret=1;a%=t;while(b){if(b&1) ret=mult(ret,a,t);a=mult(a,a,t);b>>=1;}return ret;
}int main()
{int Case=0;while(~scanf("%lld",&L) && L){++Case;ll t=gcd(8,L);L=L/t*9;ll ans;if(L%2==0 || L%5==0){ans=0;}else{t=phi(L);ans=-1;//printf("t=%lld\n",t);ll tt=sqrt(t)+1;for(ll i=1;i<=tt;i++){if(t%i==0 && quick_pow(10,i,L)==1){ans=i;break;}}if(ans<0)for(ll i=tt;i>0;i--){if(t%i==0 && quick_pow(10,t/i,L)==1){ans=t/i;break;}}}printf("Case %d: %lld\n",Case,ans);}return 0;
}
这里求欧拉函数值的用了p为素数,f(pk)=(k-1)*pk-1。然后在遍历欧拉函数因子的时候用到一个技巧:任何一个数的因子都可以和另一个因子相乘得到这个数,这两个因子中一个大一个小,小的一定小于等于sqrt(n),因此我们在查找因子的时候不要遍历1—n,而是先遍历1—sqrt(n)查找较小的因子,如果没有找到, 再从sqrt(n)—1,查找相对应的较大的因子,这样就将原来O(n)的复杂度降低为O(logn)的复杂度,十分巧妙
这里放一个优化版本的
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<ctime>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=1e5+5;ll L;ll gcd(ll a,ll b)
{return b==0?a:gcd(b,a%b);
}ll phi(ll x)
{ll ret=x;for(ll i=2;i*i<=x;i++){if(x%i==0){ret=ret/i*(i-1);x/=i;while(x%i==0){x/=i;}}if(x==1) break;}if(x>1) ret=ret/x*(x-1);return ret;
}ll mult(ll x, ll y, ll p)
{long double d=1;d=d*x/p*y;return ((x*y-((ll)d)*p)%p+p)%p;
}ll quick_pow(ll a,ll b,ll t)
{ll ret=1;a%=t;while(b){if(b&1) ret=mult(ret,a,t);a=mult(a,a,t);b>>=1;}return ret;
}int main()
{int Case=0;while(~scanf("%lld",&L) && L){++Case;ll t=gcd(8,L);L=L/t*9;ll ans;if(L%2==0 || L%5==0){ans=0;}else{t=phi(L);ans=-1;//printf("t=%lld\n",t);ll tt=sqrt(t)+1;for(ll i=1;i<=tt;i++){if(t%i==0 && quick_pow(10,i,L)==1){ans=i;break;}}if(ans<0)for(ll i=tt;i>0;i--){if(t%i==0 && quick_pow(10,t/i,L)==1){ans=t/i;break;}}}printf("Case %d: %lld\n",Case,ans);}return 0;
}
主要优化了快速幂中long long 乘法部分和欧拉函数值的求值.
这里欧拉函数值的求法用到欧拉函数容斥原理求法.即
f(n)=n∗(p1−1)/p1∗(p2−1)/p2∗.....∗(pk−1)/pkf(n)=n*(p1-1)/p1*(p2-1)/p2*.....*(pk-1)/pkf(n)=n∗(p1−1)/p1∗(p2−1)/p2∗.....∗(pk−1)/pk这里pi为n的素因子
POJ 3696 欧拉函数+快速幂相关推荐
- 小于n与n互质的所有数的和(欧拉函数+快速幂)
欧拉函数的含义:对于正整数n, φ(n)的值表示 小于n并且与n互质 的整数 个数. 欧拉函数公式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)--(1-1/pn), ...
- 【题解】poj3696 The Luckiest number 欧拉函数+快速幂
题目链接 Description Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, ...
- 牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)
题目描述 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: ⊕符号表示异或和,详见样例解释. 虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希 ...
- POJ 3090 (欧拉函数) Visible Lattice Points
题意: UVa 10820 这两个题是同一道题目,只是公式有点区别. 给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 对于点(x, y), 若g = gcd(x, y) ...
- bzoj 1409 Password 矩阵快速幂+欧拉函数
可以发现,该数组的mi就是斐波那契数列 所以要矩阵快速幂搞出第n位 但是斐波那契数列上涨的很快,这就需要欧拉定理了 p^phi(q)%q=1(gcd(p,q)==1) p是素数,所以可以用 然后需要5 ...
- 数论 - 分解质因数+欧拉函数 - Relatives POJ - 2407
数论 - 分解质因数+欧拉函数 文章目录 数论 - 分解质因数+欧拉函数 一.分解质因数 二.欧拉函数 三.模板: Relatives POJ - 2407 一.分解质因数 由 算 术 基 本 定 理 ...
- POJ 2480 (约数+欧拉函数)
题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...
- poj 3090 amp;amp; poj 2478(法雷级数,欧拉函数)
http://poj.org/problem?id=3090 法雷级数 法雷级数的递推公式非常easy:f[1] = 2; f[i] = f[i-1]+phi[i]. 该题是法雷级数的变形吧,答案是2 ...
- POJ - 2480 Longge's problem(欧拉函数+唯一分解定理)
题目链接:点击查看 题目大意:给出一个n,求 题目分析:因为N到了二的三十二次方,所以直接暴力肯定会T,这里介绍两种方法,都可以做实现这个题目 首先我们需要转化一下这个题目,先说一下优化过后的暴力枚举 ...
最新文章
- C#之Action和Func的用法(转自 https://www.cnblogs.com/LipeiNet/p/4694225.html)
- java伪装成mysql从节点_开发时java项目启动时需要连mysql等,有没有什么工具可以mock连接使得启动顺利不报错?...
- A-Grade Browser By Yahoo
- 容器的使用(6-12)
- Windows数据库编程接口简介
- JSP、Servlet中get请求和post请求的区别总结
- Microhard P900 900MHz跳频电台核心模块
- 高频课设-基于STM32的温度无线监测系统
- MySQL---数据库基础入门
- 用BWA进行序列比对
- 程序员必备屏幕录制神器(GifCam)
- windows中mysql服务无法启动
- 得力打印机Android,得力打印机技术填补国内空白
- 计算机自带游戏怎么调,如何设置电脑游戏全屏?
- 夜山明和陶渊明都向往的世界
- 体验专业级上网行为管理的特色功能
- 领英个人简介如何支持html,普通外贸业务员怎么在领英上写一份完美的自我简介( Summary)?...
- 让Win11系统更好用的几个设置
- 《庄子·外篇·田子方第二十一》
- 卸载、安装驱动注意事项
热门文章
- Spring-boot中读取config配置文件的两种方式
- 【BZOJ2073】[POI2004]PRZ 状压DP
- 图像二维离散傅里叶变换、幅度谱、相位谱
- htc g7 android 4.4,HTC G7刷机,从WM手机刷到了安卓,开启了新的刷机体验....
- 教师计算机网络培训工作总结,教师培训工作的自我总结
- 1的恢复出厂设置在哪里_罗斯蒙特变送器怎么恢复出厂设置?
- mysql 二叉树表设计_mysql---B+tree索引的设计原理
- mysql建表的规则_MYSQL建表规则 - Love彼岸花开的个人空间 - OSCHINA - 中文开源技术交流社区...
- 画出的点做交互_设计之下交互设计原型设计之概念设计
- java url接口_javaweb 后台使用url接口