鸣谢:

http://blog.csdn.net/yhrun/article/details/6908470

http://blog.sina.com.cn/s/blog_6a46cc3f0100tvqg.html

题意:链接君已失效

方法:各种数论

解析:老师找了两道数论题。这是第一道,听说比第二道简单多了。然而我并不会,看题解也是好顿理解,这题太值得做了!不做悔一生。

咳,回归正题。这道题就是一个奇妙的数。问你最短须要多少个8组成的数能整除他?所以你有思路么?并没有!有思路你也不会来看我唠叨了!

所以接下来,请你清理下脑子,来看我论证。

首先呢我们能够这么理解

8∗(10x−1)/9=k∗L当中k为常数

然后呢由于这个9在分母上。如果涉及取余或者什么东西的话会非常麻烦。所以我们把它乘到右边,然后会变成什么呢?

8∗(10x−1)=9∗k∗L(我知道以上都是废话)

再进一步8∗(10x−1)/gcd(8,L)=9∗k∗L/gcd(8,L)

接下来便于计算

我们令p=8/gcd(8,L),q=9∗L/gcd(8,L)

所以原式变为(10x−1)∗p=k∗q

由于p与q是互质的,这就是为什么我除了个最大公约数。

所以(10x−1)

即10x≡1(modq)

又依据欧拉定理

gcd(a,b)==1可得到aφ(b)≡1(modb)

所以10φ(q)≡1(modq)

之后呢又有这么个结论,最小的解为φ(q)的因子。这个呢是原根的某个定理的推论,简单说明一下原因呢是这种

设k不是φ(n)的约数

10k≡1(modn)

如果gcd(k,φ(n))=s,必定有一个数a,a是k的倍数。a+s是φ(n)的倍数。

10a≡10k≡1(modn)

10(a+s)≡10φ(n)≡1(modn)

所以10s≡1(modn)

而k不是φ(n)的约数,s是φ(n)的约数,s又是k的约数

所以s<k。而若k是符合要求的,则必定有一个更小的s。

所以答案一定是φ(n)的约数。

之后就乱搞吧!

友情提示!

欧拉可能算爆long long

所以最好把9单独讨论。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 100100
using namespace std;
typedef long long ll;
ll prime[N];
ll ans[2*N];
int hash[N];
int tot;
ll q;
void quick_pri()
{
for(int i=2;i<=100000;i++)
{
if(!hash[i])prime[++tot]=i;
for(int j=1;j<=tot&&prime[j]*i<=100000;j++)
{
hash[prime[j]*i]=1;
if(i%prime[j]==0)break;
}
}
}
ll mul(ll a,ll b)
{
ll ret=0;
while(b)
{
if(b&1)ret=(ret+a)%q;
a=(a+a)%q,b>>=1;
}
return ret;
}
ll quick_my(ll a,ll b)
{
ll ret=1;
while(b)
{
if(b&1)ret=mul(ret,a);
a=mul(a,a),b>>=1;
}
return ret;
}
ll gcd(ll a,ll b)
{
while(b)
{
ll t=b;
b=a%b;
a=t;
}
return a;
}
ll phi(ll a)
{
ll ans=a;
for(int i=1;prime[i]*prime[i]<=a;i++)
{
if(a%prime[i]==0)ans=(ans/prime[i])*(prime[i]-1);
while(a%prime[i]==0)a/=prime[i];
}
if(a!=1)ans=ans*(a-1)/a;
return ans;
}
int main()
{
quick_pri();
ll n;
int casecnt=0;
while(scanf("%lld",&n)&&n!=0)
{
tot=0;
printf("Case %d: ",++casecnt);
q=n/gcd(8,n);
if(gcd(10,9*q)!=1){printf("0\n");continue;}
else
{
ll tmp=phi(q);
if(q%3!=0)tmp*=6;
else tmp*=9;
q*=9;
for(ll i=1;i*i<=tmp;i++)
{
if(tmp%i==0)ans[++tot]=i,ans[++tot]=tmp/i;
}
sort(ans+1,ans+1+tot);
int flag=0;
for(int i=1;i<=tot;i++)
{
if(quick_my(10,ans[i])==1){printf("%lld\n",ans[i]);flag=1;break;}
}
if(!flag)printf("0\n");
}
}
}

POJ 3696 神TM数论的更多相关文章

  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

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

  3. poj 3696 The Luckiest Number

    The Luckiest Number 题目大意:给你一个int范围内的正整数n,求这样的最小的x,使得:连续的x个8可以被n整除. 注释:如果无解输出0.poj多组数据,第i组数据前面加上Case ...

  4. poj 2154 Color < 组合数学+数论>

    链接:http://poj.org/problem?id=2154 题意:给出两个整数 N 和 P,表示 N 个珠子,N种颜色,要求不同的项链数, 结果 %p ~ 思路: 利用polya定理解~定理内 ...

  5. POJ 1082---->一个神一般的题

    代码只有10行,反正我是看了题解才知道的. 嗯 首先 看到这个题, BFS+一堆判断(什么平年闰年跨年各种乱搞肯定能搞出来,但是Code length就不一定了)... 然后呢 就看到了这个题解 从后 ...

  6. POJ 3641 Pseudoprime numbers (数论+快速幂)

    题目链接:POJ 3641 Description Fermat's theorem states that for any prime number p and for any integer a ...

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

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

  8. POJ 1845-Sumdiv 题解(数论,约数和公式,逆元,高中数学)

    题目描述 给定A,B,求A^B的所有因数的和,再MOD 9901 输入 一行两个整数 A 和 B. 输出 一行,一个整数 样例输入 2 3 样例输出 15 提示 对于100%的数据满足:0 <= ...

  9. POJ 2154 Color [Polya 数论]

    和上题一样,只考虑旋转等价,只不过颜色和珠子$1e9$ 一样的式子 $\sum\limits_{i=1}^n m^{gcd(i,n)}$ 然后按$gcd$分类,枚举$n$的约数 如果这个也化不出来我莫 ...

随机推荐

  1. UITableViewHeaderFooterView的使用+自己主动布局

    UITableViewHeaderFooterView的使用+自己主动布局 使用UITableView的header或footer复用时,假设採用自己主动布局,你会发现有约束冲突,以下这样写能够消除约 ...

  2. 三种java 去掉字符串中的重复字符函数

    三种java 去掉字符串中的重复字符函数 public static void main(string[] args) { system.out.println(removerepeatedchar( ...

  3. 在JS中,一个自定义函数如何调用另一个自定义函数中的变量

    function aa1511() { var chengshi="马鞍山"; var shengfen="安徽省"; return shengfen+&quo ...

  4. codeforces 148D 概率DP

    题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢. 王妃每次抓一仅仅老鼠,龙每次抓完一仅仅老鼠之后会有一仅仅老鼠跑出来. 每次抓老鼠和跑出来的老鼠都是随 ...

  5. Swift - 添加、修改、删除通讯录联系人

    使用AddressBook.framework框架,我们除了可以很方便的获取通信录里的联系人.同时,还能对通讯录进行新增.修改.删除联系人操作. (注意:这些操作同查询一样,首先需要发起授权请求) 1 ...

  6. 关于new enhancement的一些知识

    关于new enhancement sap源程序里也给我们留了很多. 以下例句point .section.spot说明这些知识点. 1.不管是point还是section 都是基于spot的,spo ...

  7. perl 继承小例子

    <pre name="code" class="html"><pre name="code" class="ht ...

  8. [置顶] 遇到难题(bug)的解决方法心得

    今天早上花了2个小时解决一个问题...界面抖动.. 最近把淄博项目的界面用BT改了,后来发现4个界面之间切换会抖动.. 就是整个界面会左右抖动... 文章出处: PHP攻城师 www.phpgcs.c ...

  9. jsp静态化之简单介绍

    package com.zwd.text; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputS ...

  10. 编程算法 - 有序双循环链表的插入 代码(C)

    有序双循环链表的插入 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 有序双循环链表的插入, 须要找到插入位置, 能够採用, 两个指针, 一个在前, 一 ...