题目的意思大概就是问是否存在一串全是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 欧拉函数+快速幂相关推荐

  1. 小于n与n互质的所有数的和(欧拉函数+快速幂)

    欧拉函数的含义:对于正整数n, φ(n)的值表示 小于n并且与n互质 的整数 个数. 欧拉函数公式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)--(1-1/pn), ...

  2. 【题解】poj3696 The Luckiest number 欧拉函数+快速幂

    题目链接 Description Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, ...

  3. 牛客 华华给月月出题 (积性函数+欧拉筛+快速幂)

    题目描述 华华刚刚帮月月完成了作业.为了展示自己的学习水平之高超,华华还给月月出了一道类似的题: ⊕符号表示异或和,详见样例解释. 虽然月月写了个程序暴力的算出了答案,但是为了确保自己的答案没有错,希 ...

  4. POJ 3090 (欧拉函数) Visible Lattice Points

    题意: UVa 10820 这两个题是同一道题目,只是公式有点区别. 给出范围为(0, 0)到(n, n)的整点,你站在原点处,问有多少个整点可见. 对于点(x, y), 若g = gcd(x, y) ...

  5. bzoj 1409 Password 矩阵快速幂+欧拉函数

    可以发现,该数组的mi就是斐波那契数列 所以要矩阵快速幂搞出第n位 但是斐波那契数列上涨的很快,这就需要欧拉定理了 p^phi(q)%q=1(gcd(p,q)==1) p是素数,所以可以用 然后需要5 ...

  6. 数论 - 分解质因数+欧拉函数 - Relatives POJ - 2407

    数论 - 分解质因数+欧拉函数 文章目录 数论 - 分解质因数+欧拉函数 一.分解质因数 二.欧拉函数 三.模板: Relatives POJ - 2407 一.分解质因数 由 算 术 基 本 定 理 ...

  7. POJ 2480 (约数+欧拉函数)

    题目链接: http://poj.org/problem?id=2480 题目大意:求Σgcd(i,n). 解题思路: 如果i与n互质,gcd(i,n)=1,且总和=欧拉函数phi(n). 如果i与n ...

  8. poj 3090 amp;amp; poj 2478(法雷级数,欧拉函数)

    http://poj.org/problem?id=3090 法雷级数 法雷级数的递推公式非常easy:f[1] = 2; f[i] = f[i-1]+phi[i]. 该题是法雷级数的变形吧,答案是2 ...

  9. POJ - 2480 Longge's problem(欧拉函数+唯一分解定理)

    题目链接:点击查看 题目大意:给出一个n,求 题目分析:因为N到了二的三十二次方,所以直接暴力肯定会T,这里介绍两种方法,都可以做实现这个题目 首先我们需要转化一下这个题目,先说一下优化过后的暴力枚举 ...

最新文章

  1. C#之Action和Func的用法(转自 https://www.cnblogs.com/LipeiNet/p/4694225.html)
  2. java伪装成mysql从节点_开发时java项目启动时需要连mysql等,有没有什么工具可以mock连接使得启动顺利不报错?...
  3. A-Grade Browser By Yahoo
  4. 容器的使用(6-12)
  5. Windows数据库编程接口简介
  6. JSP、Servlet中get请求和post请求的区别总结
  7. Microhard P900 900MHz跳频电台核心模块
  8. 高频课设-基于STM32的温度无线监测系统
  9. MySQL---数据库基础入门
  10. 用BWA进行序列比对
  11. 程序员必备屏幕录制神器(GifCam)
  12. windows中mysql服务无法启动
  13. 得力打印机Android,得力打印机技术填补国内空白
  14. 计算机自带游戏怎么调,如何设置电脑游戏全屏?
  15. 夜山明和陶渊明都向往的世界
  16. 体验专业级上网行为管理的特色功能
  17. 领英个人简介如何支持html,普通外贸业务员怎么在领英上写一份完美的自我简介( Summary)?...
  18. 让Win11系统更好用的几个设置
  19. 《庄子·外篇·田子方第二十一》
  20. 卸载、安装驱动注意事项

热门文章

  1. Spring-boot中读取config配置文件的两种方式
  2. 【BZOJ2073】[POI2004]PRZ 状压DP
  3. 图像二维离散傅里叶变换、幅度谱、相位谱
  4. htc g7 android 4.4,HTC G7刷机,从WM手机刷到了安卓,开启了新的刷机体验....
  5. 教师计算机网络培训工作总结,教师培训工作的自我总结
  6. 1的恢复出厂设置在哪里_罗斯蒙特变送器怎么恢复出厂设置?
  7. mysql 二叉树表设计_mysql---B+tree索引的设计原理
  8. mysql建表的规则_MYSQL建表规则 - Love彼岸花开的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 画出的点做交互_设计之下交互设计原型设计之概念设计
  10. java url接口_javaweb 后台使用url接口