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. 如何注册Filter

    AX文件的一个对外接口DllRegisterServer,由外部调用,比如注册AX的时候:regsvr32 xxx.ax       通常情况下,我们的filter可能注册在"Direct ...

  2. javaWeb之eclipse创建Servlet模板快捷键设置

    没有模板创建Servlet 出现的是除了doPOST 和doGet方法 还有许多方法和一些注释,页面不够清晰 创建模板的步骤是: 1.点击window下的preference 选项 2在 表单框里填写 ...

  3. CentOS源码包安装apache、nginx服务

    1.通过官网下载apache.nginx源码包 2.进入apache源码包所在目录,解压tar -xf httpd-2.4.12.tar.gz 3.cd httpd-2.4.12 4.阅读README ...

  4. SQLite笔记

    一.SQLite下载: http://www.sqlite.org/download.html (或在NuGet下载安装) 二.SQLite操作: 1.添加引用System.Data.SQLite,如 ...

  5. Array.from()

    es6 Array.from() 方法将两类对象转为真正的数组 用法:用于将两类对象转为真正的数组:类似数组的对象和可遍历(iterable)的对象(包含ES6新增的数据结构Set和Map); 说明: ...

  6. HihoCoder - 1139

    在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了.在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示其中红色的点 ...

  7. 8.C++-类的关键字

    在之前学习的C++章节里,可以发现结构体越来越不像C语言里的结构体了 比如,里面可以定义函数,可以定义private/public,结构体名还可以指向父类. 但是C++需要兼容C,所以C++中便提供了 ...

  8. JVM内存分析

    1.java内存模型分析 java虚拟机运行时数据存储区域包括线程隔离和线程共享两类,整个PC的内存图如下所示: 下面对以上内存区域说明: 1.1 register和cache 当代计算机一般有多个c ...

  9. Readis For Windows安装及密码、IP限制

    一.下载与安装Readis Github下载地址:https://github.com/MicrosoftArchive/redis/tags 下载.MSI后下一步安装即可 二.验证安装 1. 在&q ...

  10. rabbitmq简单收发服务搭建

    消息发送.接收简单代码示例 mq.xml //rabbitmq config spring.rabbitmq.host=ip:host spring.rabbitmq.username= spring ...