| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4281 人关注过本帖
标题:【新手交流】取余数问题:输入x,n,输出x的n次方除1e9+7的余数[已有答案,欢 ...
只看楼主 加入收藏
雨铃半百
Rank: 1
来 自:223-3
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-10-8
结帖率:100%
收藏
 问题点数:0 回复次数:5 
【新手交流】取余数问题:输入x,n,输出x的n次方除1e9+7的余数[已有答案,欢迎讨论]
题目:输入x,n,范围(x<1000,n<1e18)输出x的n次方除1e9+7的余数
x,n很大的时候也要能输出答案 注意效率
代码:
#include"iostream"
#define K 1000000007
using namespace std;
int main()
{
    int x,n,i,ans;
    cin>>x;
    cin>>n;
    ans=x%K;
    for (i=0;i<n-1 ;i++ )
        ans=(ans*x)%K;
    cout<<ans;
    return 0;
}
搜索更多相关主题的帖子: 输入 输出 次方 答案 欢迎 
2017-10-10 21:53
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:0 
n是int型,恐怕会溢出
2017-10-10 22:13
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
记得处理长整形数据后可以用二分法或者理解成二进制的01位运算实现~

((a∧b)∧2)%c=(((a∧b)%c)∧2)%c
这个是我自己理解的~或者网上可以搜到这个思想的解法~记得是快速求余的方法么……一时不知道那个术语怎么表达了~

[此贴子已经被作者于2017-10-10 23:45编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-10 23:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
深夜断网……于是用手机临时用C敲一个……对着电脑测试了一下~看看有没有问题~

程序代码:

#include<stdio.h>

unsigned int  fun(unsigned int x,unsigned int n,unsigned int k);

int main()
{
    unsigned int x=0;
    unsigned int n=0;
    unsigned int k=0;
    
    scanf("%u%u%u",&x,&n,&k);

    printf("%u\n",fun(x,n,k));

    return 0;

}


unsigned int  fun(unsigned int x,unsigned int n,unsigned int k)
{
    unsigned int s=1;
    unsigned int t=x%k;

    while (n)
    {
         if (n%2)
             s=s*t%k;

        t=t*t%k;
        n>>=1;
    }

    return s;
}


[此贴子已经被作者于2017-10-11 03:17编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-10-11 03:15
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
先分析一下
如果是依次相乘,因为结果是除1000000007的余数,那么中间结果最大可能出现 1000000006 * 999,需要40bits存储
如果是用快速幂,因为结果是除1000000007的余数,那么中间结果最大可能出现 1000000006 * 1000000006,需要60bits存储
所以这题的数据类型得用 uint64_t/int64_t
另外,既然题目中提到“余数”,那就不考虑x为负或n为负的情况。

程序代码:
#include <stdio.h>
#include <inttypes.h>

#define K 1000000007

int main(void)
{
    uint32_t x, n;
    scanf( "%"SCNu32"%"SCNu32, &x, &n );
   
    uint32_t r = 1;
    for( uint64_t t=x; n!=0; n>>=1, t=t*t%K )
        if( n%2 == 1 )
            r = (r*t)%K;

    printf( "%"PRIu32"\n", r );
    return 0;
}

收到的鲜花
  • 九转星河2017-10-11 10:13 送鲜花  20朵   附言:厉害~学习了~
2017-10-11 10:04
雨铃半百
Rank: 1
来 自:223-3
等 级:新手上路
帖 子:14
专家分:0
注 册:2017-10-8
收藏
得分:0 
这个是好久远的题了哈哈,蟹蟹大家帮助呀。当时只是想了最简单的方法,没有深入了解,回来之后发现大家的思路都很棒,十分感谢十分感谢~~~
2018-04-11 18:21
快速回复:【新手交流】取余数问题:输入x,n,输出x的n次方除1e9+7的余数[已有答案 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.459064 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved