P8652 [蓝桥杯 2017 国 C] 小数第 n 位 题解

不知道为啥别的题解直接就快速幂了……感觉这个不容易看出

小数点后第 n 位就是把小数点往后移 n 位后的个位。

根据小学数学知识,把一个数的小数点往后移 n 位相当于把这个数乘以 10n

所以 ab 的第 n 位即为 a×10nb 的个位,即 a×10nbmod10

推式子:

a×10nbmod10=a×10nb10kmod10=a×10n10bkbmod10=a×10nmod10bb

快速幂算分子即可。

注意 10b>232,需要龟速乘或者开 __int128

#include <cstdio>
__int128 P(__int128 x, __int128 y, __int128 M)
{
    __int128 q = 1;
    for (; y; y >>= 1, x = x * x % M)
        if (y & 1)
            q = q * x % M;
    return q;
}
__int128 a, b, n;
int main()
{
    scanf("%lld%lld%lld", &a, &b, &n);
    for (__int128 i = n; i < n + 3; ++i)
        printf("%lld", a * P(10, i, 10 * b) % (10 * b) / b);
    return 0;
}
posted @   Jijidawang  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示