理科男【数论】

题目大意:

对求分数 AB A B ,求其在 K K 进制下是有限小数还是循环小数。如果是有限小数,求小数点后的位数;如果是循环小数,则求混循环部分和循环节的长度又分别是多少。
Input

3
1 8 10
17 99 10
217 990 10

Ouput O u p u t

3 0
0 2
1 2

思路:

这道数论,好难啊。。。
证明我肯定是看不懂了。只能按照题解所说的打,但是什么都不懂。
在这里把 题解 的证明放一下。

首先把 AB A B 约分成既约分数。设 a[1]=A a [ 1 ] = A r[n] r [ n ] 为原分数小数点后第 n n 位的数。
显然有 r[1]=floor(K×a[1]B)
剩下来的余数 a[2]=K×a[1] a [ 2 ] = K × a [ 1 ] mod m o d B B
依此类推我们有 r[n]=floor(K×a[n]B) a[n]=K×a[n1] a [ n ] = K × a [ n − 1 ] mod m o d B B
不难发现如果 a[p]=a[q]p<q,那么小数点后第 p p 位到第 q1 位这一段就可以视为一
个循环节。
暴力计算数列 a a ,找到第一个与前面重复的项,就可以找到最短循环节了。
这个重复的项前面的部分导出混循环部分。
如果最早在 p 处计算到 a[p]=0 a [ p ] = 0 ,那么原分数就是一个小数点后有 p1 p − 1 位的有限小数。
以上便是 50 分的解法。


50分解法还很容易理解,但是接下来的100分做法就真的很难理解了。。。(也许是我太菜了吧)

下面我们对 a a 数列的性质做一些讨论。
如果 gcd(B,K)=1,对于任意的 i i 都有 gcd(a[i],B)=1
K K ′ K K mod B B 时的乘法逆元,即 KK mod m o d B=1 B = 1 。由乘法逆元的性质 K K ′ 存在且唯一。
假设最早出现重复的位置是 a[p]=a[q](p<q) a [ p ] = a [ q ] ( p < q )
如果 p p 1,那么 a[p1]=K×a[p] a [ p − 1 ] = K ′ × a [ p ] mod m o d B=K×a[q] B = K ′ × a [ q ] mod m o d B=a[q1] B = a [ q − 1 ]
也就是出现了更早的重复,与题设矛盾。所以显然有 p=1 p = 1
这时,显然原分数是一个纯循环小数,且最短循环节长度是 q1 q − 1
x=q1 x = q − 1 。显然 a[q]=a[1]×Kx a [ q ] = a [ 1 ] × K x mod m o d B=a[1] B = a [ 1 ] ,于是 Kx K x mod m o d B=1 B = 1
这就转化成了求 K K mod B B 的阶的问题了。
由欧拉定理 Kphi(B)=1( mod m o d B) B ) ,由阶的性质 x|phi(B) x | p h i ( B )
我们可以将 phi(B) p h i ( B ) 分解素因数,并初始化 x=phi(B) x = p h i ( B )
之后考虑 phi(B) p h i ( B ) 的每个素因数 p p 。如果 K(x/p)=1( mod m o d B) B ) ,就 xxp x ← x p ,并继续试除 p p
否则转下一个素因数。这样就可以求出 K mod m o d B B 的阶了,这就是最短循环节的长度。
如果 gcd(B,K)>1,那么 gcd(a[2],B)>1 g c d ( a [ 2 ] , B ) > 1 。设 gcd(a[2],B)=g g c d ( a [ 2 ] , B ) = g ,不难发现对于任意的 i2 i ≥ 2 ,有 g|(a[i],B) g | ( a [ i ] , B )
不妨设 B=Bg B ′ = B g a[i]=a[i]g(i2) a ′ [ i ] = a [ i ] g ( i ≥ 2 )
若此时 gcd(B,K)=1 g c d ( B ′ , K ) = 1 ,就转化为了上面的情况。否则继续这个过程。
如果上面的转换进行了 T T 次,由于 a[1] a[T] a [ T ] 与后面 a a 数列的循环无关。
卡一下范围便会知道循环节的最后一个数字与混循环部分最后一个数字一定不相等。
于是原分数的混循环长度就是 T 了。
特殊地,如果在 T T 次转换之后得到的最后一个 B=1,那么之后 a a 数列的值全为 0。这时
我们可以断言原分数是一个小数点后有 T 位的有限小数。
以上便是 100 分的做法。

好吧这么多我知道没人会看


代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

long long n,a,k,sum,gcd,b,num,ans;

long long phi(long long x)
{
    long long ans=x;
    for (long long i=2;i*i<=x;i++)
     if (!(x%i))
     {
        ans=ans/i*(i-1);
        while (!(x%i)) x/=i;
     }
     if (x>1) ans=ans/x*(x-1);
    return ans;
}

long long binary(long long x,long long y,long long o)
{
    long long ans=0;
    for (;y;y>>=1)
    {
        if (y&1) ans=(ans+x)%o;
        x=(x<<1)%o;
    }
    return ans;
}

long long ksm(long long x,long long y,long long o)
{
    long long ans=1;
    for (;y;y>>=1)
    {
        if (y&1) ans=binary(ans,x,o);
        x=binary(x,x,o);
    }
    return ans;
}

int main()
{
    scanf("%lld",&n);
    while (n--)
    {
        scanf("%lld%lld%lld",&a,&b,&k);
        gcd=__gcd(a,b);
        a/=gcd;
        b/=gcd;
        sum=0;
        while (__gcd(b,k)>1)
        {
            sum++;
            gcd=__gcd(b,k);
            b/=gcd;
        }
        printf("%lld ",sum);
        if (b==1) 
        {
            printf("0\n");
            continue;
        }
        num=ans=phi(b);
        for (int i=2;i*i<=num;i++)
         if (!(num%i))
         {
            while ((!(ans%i))&&ksm(k,ans/i,b)==1) ans/=i;
            while (!(num%i)) num/=i;
         }
        if (num>1&&ksm(k,ans/num,b)==1) ans/=num;
        printf("%lld\n",ans);
    }
    return 0;
}
基于实时迭代的数值鲁棒NMPC双模稳定预测模型(Matlab代码实现)内容概要:本文介绍了基于实时迭代的数值鲁棒非线性模型预测控制(NMPC)双模稳定预测模型的研究与Matlab代码实现,重点在于通过数值方法提升NMPC在动态系统中的鲁棒性与稳定性。文中结合实时迭代机制,构建了能够应对系统不确定性与外部扰动的双模预测控制框架,并利用Matlab进行仿真验证,展示了该模型在复杂非线性系统控制中的有效性与实用性。同时,文档列举了大量相关的科研方向与技术应用案例,涵盖优化调度、路径规划、电力系统管理、信号处理等多个领域,体现了该方法的广泛适用性。; 适合人群:具备一定控制理论基础和Matlab编程能力,从事自动化、电气工程、智能制造等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于解决非线性动态系统的实时控制问题,如机器人控制、无人机路径跟踪、微电网能量管理等;②帮助科研人员复现论文算法,开展NMPC相关创新研究;③为复杂系统提供高精度、强鲁棒性的预测控制解决方案。; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,重点关注NMPC的实时迭代机制与双模稳定设计原理,并参考文档中列出的相关案例拓展应用场景,同时可借助网盘资源获取完整代码与数据支持。
UWB-IMU、UWB定位对比研究(Matlab代码实现)内容概要:本文介绍了名为《UWB-IMU、UWB定位对比研究(Matlab代码实现)》的技术文档,重点围绕超宽带(UWB)与惯性测量单元(IMU)融合定位技术展开,通过Matlab代码实现对两种定位方式的性能进行对比分析。文中详细阐述了UWB单独定位与UWB-IMU融合定位的原理、算法设计及仿真实现过程,利用多传感器数据融合策略提升定位精度与稳定性,尤其在复杂环境中减少信号遮挡和漂移误差的影响。研究内容包括系统建模、数据预处理、滤波算法(如扩展卡尔曼滤波EKF)的应用以及定位结果的可视化与误差分析。; 适合人群:具备一定信号处理、导航定位或传感器融合基础知识的研究生、科研人员及从事物联网、无人驾驶、机器人等领域的工程技术人员。; 使用场景及目标:①用于高精度室内定位系统的设计与优化,如智能仓储、无人机导航、工业巡检等;②帮助理解多源传感器融合的基本原理与实现方法,掌握UWB与IMU互补优势的技术路径;③为相关科研项目或毕业设计提供可复现的Matlab代码参考与实验验证平台。; 阅读建议:建议读者结合Matlab代码逐段理解算法实现细节,重点关注数据融合策略与滤波算法部分,同时可通过修改参数或引入实际采集数据进行扩展实验,以加深对定位系统性能影响因素的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值