The Luckiest Number

    题目大意:给你一个int范围内的正整数n,求这样的最小的x,使得:连续的x个8可以被n整除。

    注释:如果无解输出0。poj多组数据,第i组数据前面加上Case i: 即可。

      想法:这题还是挺好的。我最开始的想法是一定有超级多的数输出0。然后...我就在哪里找啊找....其实这道题是一道比较好玩儿的数论题。我们思考:连续的8可用什么来表示出来?$\frac{(10^x-1)}{9}\cdot 8$。其实想到这一步这题就做完了。这题的精髓就在于告诉我们连续的连续的一串数的表达方式。想到这点其实有一个比较容易接受的方法:这鬼东西是一个等比数列。然后,式子就可以化成了以下的形式及推导

    $\Rightarrow n|\frac{10^x-1}{9}\cdot 8$

    $\Rightarrow 9\cdot n|(10^x-1)\cdot 8$

    $\Rightarrow \frac{9\cdot n}{gcd(n,8)}|\frac{(10^x-1)\cdot8}{gcd(n,8)}$

    $\because gcd(\frac n{gcd(n,8)},\frac8{gcd(n,8)})=1$

    且$gcd(9,8)=1$

    $\therefore gcd(\frac{9\cdot n}{gcd(n,8)},\frac{8}{gcd(n,8)})=1$

    $\Rightarrow \frac{9\cdot n}{gcd(n,8)}|10^x-1$

    $\Rightarrow 10^x\equiv1(mod\frac{9\cdot n}{gcd(n,8)})$

    所以此时,我们只需要枚举mod数即可。但是有些操作是不必要的,在此,我们有两种简单的优化:

    1.对于mod数取$\varphi$,然后暴力枚举$\varphi$的所有因子。时间复杂度$O(\sqrt{n})$,验证是用快速幂,时间复杂度O(logn),所以,总时间复杂$O(\sqrt{n}\cdot {logn})$。

    2.用BSGS优化,我没想到(鸣谢CQzhangyu)。时间复杂度同理。

    但是对于第一种我们可以用Miller_Rabin 和Pullard_rho进行爆炸般的优化,但是没什么必要......

      最后,附上丑陋的代码......

#include <iostream>
#include <cstdio>
typedef long long ll;
using namespace std;
ll gcd(ll a,ll b)//只取一次mod的gcd,鸣谢EdwardFrog
{
return b?gcd(b,a%b):a;
}
ll quick_multiply(ll a,ll b,ll mod)//快速乘,防止爆longlong,虽然没有必要
{
ll ans=;
a%=mod;
b%=mod;
while(b)
{
if(b&) ans=(ans+a)%mod;
b>>=;
a=(a+a)%mod;
}
return ans;
}
ll quick_power(ll a,ll b,ll mod)//这题不爆longlong,但是这样是必须的,因为9*n在longlong范围内
{
ll ans=;
a%=mod;
while(b)
{
if(b&) ans=quick_multiply(ans,a,mod);
b>>=;
a=quick_multiply(a,a,mod);
}
return ans;
}
int main()
{
ll n;
ll cnt=;
while()
{
scanf("%lld",&n);
if(n==) return ;
printf("Case %lld: ",++cnt);
n=*n/gcd(n,);
ll m=n;
ll phi=n;
if(gcd(n,)!=)//这是欧拉定理所必须满足的,如果不行显然无解
{
printf("0\n");
continue;
}
for(ll i=;i*i<=m;++i)
{
if(m%i==)
{
phi=phi/i*(i-);
while(m%i==)
{
m/=i;
}
}
}
if(m!=) phi=phi/m*(m-);
// cout<<"phi="<<phi<<endl;调试信息
ll minn=phi;//我想取最小值,且最大值是phi
for(ll i=;i*i<=phi;i++)//这步是验证。
{
if(phi%i==)
{
if(quick_power(,i,n)==) minn=min(minn,i);
if(quick_power(,phi/i,n)==) minn=min(minn,phi/i);
}
}
printf("%lld\n",minn);
}
}

    小结:错误,枚举一个数的因子其实是可以根号时间内完成的...我傻逼了......

        还有,别忘记phi开始的初值是n,不是1.

poj 3696 The Luckiest Number的更多相关文章

  1. poj 3696 The Luckiest number 欧拉函数在解a^x=1modm的应用

    题意: 给一个L,求长度最小的全8数满足该数是L的倍数. 分析: 转化为求方程a^x==1modm. 之后就是各种数学论证了. 代码: //poj 3696 //sep9 #include <i ...

  2. POJ 3696 The Luckiest number (欧拉函数,好题)

    该题没思路,参考了网上各种题解.... 注意到凡是那种11111..... 22222..... 33333.....之类的序列都可用这个式子来表示:k*(10^x-1)/9进而简化:8 * (10^ ...

  3. POJ3696 The Luckiest number

    题意 Language:Default The Luckiest number Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7 ...

  4. POJ_3696 The Luckiest number 【欧拉定理+同余式+对取模的理解】

    一.题目 Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his ...

  5. poj_3696_The Luckiest number

    Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...

  6. POJ3696:The Luckiest number(欧拉函数||求某数最小的满足题意的因子)

    Chinese people think of '8' as the lucky digit. Bob also likes digit '8'. Moreover, Bob has his own ...

  7. HDU 2462 The Luckiest number

    The Luckiest number Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Ori ...

  8. The Luckiest number(hdu2462)

    The Luckiest number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. 【POJ 3696】 The Luckiest number

    [题目链接] http://poj.org/problem?id=3696 [算法] 设需要x个8 那么,这个数可以表示为 : 8(10^x - 1) / 9, 由题, L | 8(10^x - 1) ...

随机推荐

  1. HTML5之Canvas画正方形

    HTML5之Canvas画正方形 1.设计源码 <!DOCTYPE html> <head> <meta charset="utf-8" /> ...

  2. 非空校验的提示按钮(shiro项目中来的六)

    一:图示 二,js脚本 /** * jquery tips 提示插件 jquery.tips.js v0.1beta * * 使用方法 * $(selector).tips({ //selector ...

  3. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  4. freemarker之include指令(九)

    freemarker之include指令 1.父页面ftl <html> <head> <meta http-equiv="content-type" ...

  5. cisco linksys ea3500 刷机 openwrt

    家中router改造成千兆华为A1,淘汰下来的cisco linksys ea3500  终于可以去刷机 openwrt,尽情折腾啦! 分享步骤: 准备文件 https://archive.openw ...

  6. 简述MyBatis的体系结构

    MyBatis体系结构主要由以下几个关键部分: 1.加载配置 配置有两种形式:一种是xml配置文件,另一种是java代码的注解MyBatis将SQL的配置信息加载成为一个个的MappedStateme ...

  7. I/HwPointEventFilter: do not support AFT because of no config

    I/HwPointEventFilter: do not support AFT because of no config 这是华为对系统做了修改,默认不打印日志,要改配置 在拨号界面输入:以下进入工 ...

  8. 【BZOJ4650】【NOI2016】优秀的拆分(后缀数组)

    [BZOJ4650][NOI2016]优秀的拆分(后缀数组) 题面 BZOJ Uoj 题解 如果我们知道以某个位置为开始/结尾的\(AA\)串的个数 那就直接做一下乘法就好 这个怎么求? 枚举一个位置 ...

  9. SPOJ1825:Free tour II

    题意 luogu的翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Sol 点分治辣 如果是等于\(k\)的话,开个桶取\(max\)就好了 ...

  10. java怎么解析带有特殊字符的字符串

    可以使用StringEscapeUtils这个工具类.