poj 3358
/**
大意: 给定小数(p/q),求其循环节的大小和循环节开始的位置
解法: 若出现循环 ai*2^m= aj%p;
即 2^m %p =1
若2与p 互素,则可由欧拉函数的,
不互素,需将其转化为互素的情况,,也就出现了循环节开始位置的差异; 值得学习的地方:
1、
首先,先对该分数 n/m 化简。
temp = gcd(n,m);
// n = n / temp
// m = m / temp
// n = n mod m
// 接下来就是需要知道一个分数化成k进制小数的方法:
// for i = 0 to 需要的位数
// n = n * k;
// bit[i] = n / m;
// 2、
a ^ x % q = 1,对于其任意一个解x ,它的最小解x0 | x 。
在a 与 q 互质的条件下,ψ(q) 是它的一个解。
所以有x0 | ψ(q)这样一个条件,可以先求出q的欧拉函数值ψ(q),再在它的因子中找最小解。
注意中间过程int可能溢出。 **/ #include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;
long long fn[];
long long gcd(long long a,long long b){
if(b==)
return a;
return gcd(b,a%b);
} long long pow(long long a,long long b,long long m){
if(b==)
return ;
long long c =;
a =a%m;
while(b){
if(b&)
c = (long long )c*a%m;
a =(long long )a*a%m;
b>>=;
}
return c;
} long long eular(long long n){
long long m = (long long )sqrt(n+0.5);
long long ans = n;
for(long long i=;i<=m;i++) if(n%i==){
ans = ans/i*(i-);
while(n%i==)
n/=i;
}
if(n>)
ans = ans/n*(n-);
return ans;
} int main()
{
long long n,m;
char c; long long cur =;
while(cin>>n>>c>>m){
int temp = gcd(n,m); // 注意:一上午自己就是因为这个图省劲没有先将gcd(n,m)存起来,,导致后边的m/gcd(n,m) 一直是n与m的最大公约数是1的情况,即m没有得化简。。。
n = n/temp;
m = m/temp;
n = n%m;
long long ans1,ans2;
long long t=;
while(m%==){
m = m/;
t++;
}
ans1 = t+; long long res = eular(m);
if(res==){
ans2 = ;
}else{
long long cnt =;
// cout<<res<<endl;
for(long long i=;i*i<=res;i++)if(res%i==){
fn[cnt++] = i;
fn[cnt++] = res/i;
}
sort(fn,fn+cnt);
for(long long i=;i<cnt;i++){
if(pow(,fn[i],m)==){
ans2 = fn[i];
break;
}
}
}
cout<<"Case #"<<cur++<<": "<<ans1<<","<<ans2<<endl;
}
return ;
}
poj 3358的更多相关文章
- poj 3358 Period of an Infinite Binary Expansion
由乘2取整得到分数的小数位,可以找到规律!!! 例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10…… 取整后:1/10,2/10,4/10,8/10,6/10,2/10 ...
- 数学之欧拉函数 &几道poj欧拉题
欧拉函数总结+证明 欧拉函数总结2 POJ 1284 原根 #include<iostream> #include<cstdio> #include<cstring> ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
- POJ 2255. Tree Recovery
Tree Recovery Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11939 Accepted: 7493 De ...
随机推荐
- 达内TTS6.0课件oop_day02
- SQL学习之学会使用子查询
1.SELECT语句是SQL的查询.我之前的随笔中所用的SELECT语句都是简单的查询,即从单个数据库表中检索数据的单条SELECT语句. 查询:任何SQL语句都是查询,但此术语一般指SELECT语句 ...
- java中关于SSL/TSL的介绍和如何实现SSL Socket双向认证
一. SSL概述 SSL协议采用数字证书及数字签名进行双端实体认证,用非对称加密算法进行密钥协商,用对称加密算法将数据加密后进行传输以保证数据的保密性,并且通过计算数字摘要来验证数据在传 ...
- oracle 使用 decode函数 或 case when 实现行转列
----创建测试表 create table student_score( name varchar2(20), subject varchar2(20), score number(4,1) ); ...
- 使用分析函数实现Oracle 10G提供的CONNECT_BY_ISLEAF和CONNECT_BY_ROOT的功能(转载)
文章转载至:http://blog.csdn.net/wzy0623/article/details/1644049 如果,有侵犯您权益的地方,烦请及时的告知我,我会即刻停止侵权行为 Oracle 1 ...
- mysql不区分大小写解决
今天遇到一个情况,前台验证用户昵称的时候发现无论输入Fred fred亦或是FrEd 都会显示昵称存在(这并不是我所期望的结果) debug发现并不是程序问题 hibernate也只是吧hql装成my ...
- 向上取整Ceil,向下取整Floor,四舍五入Round
几个数值函数的功能实现: (1)int Ceil(float f) int Ceil(float f) { int integer = (int)f; if (f > (float)intege ...
- Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同
Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...
- python自学笔记(一)简单了解python
脚本解释型语言的内部机制 python先将脚本编译成字节码文件(pyc,pyo) python虚拟机解释并运行字节码文件 编译型语言的内部机制 先将源代码编译成机器码(机器能读懂的代码),生成可执行文 ...
- php保留小数格式的多种方法
php保留小数格式,定义小数格式,小数点,位数,小数位数: 方法一:(推荐)bcmul(1000.90,1,2);//两个数相乘1000.90*1, 保留两位小数点(无四舍五入)<返回strin ...