| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3726 人关注过本帖, 1 人收藏
标题:一道新生赛的题目
只看楼主 加入收藏
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:39 
一道新生赛的题目
给定两个正整数m和n(m,n>1),求最小的正整数d,满足如下要求(n^d表示n的d次方)
       (n^d-1)能够被(m*n-1)整除


输入样例
2 2
12 11
22 20
32 20
42 38
9952 6231
9962 7277
9972 8898
9982 9508
9992 9320
0 0


输出样例
2
65
219
42
140
6201091
619602
2802024
103740
276660


提示
提示,在[1,m*n-2]范围内一定能找到满足条件的答案
搜索更多相关主题的帖子: 正整数 
2017-03-06 16:26
莫名Vet
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2017-3-6
收藏
得分:0 
好像d是在φ(n*m-1)的因子里,但不会求最小值
2017-03-06 16:30
小白小白一只
Rank: 2
来 自:吉林大学
等 级:论坛游民
帖 子:16
专家分:41
注 册:2016-3-30
收藏
得分:3 
穷举法,从1开始一个一个试,用FOR循环很容易,满足题设条件跳出循环
2017-03-06 18:25
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:3 
程序代码:
#include <stdio.h>

int main(void)
{
    int m, n;
    int t;
    printf("请输入大于1的 m n : ");
    scanf("%d %d", &m, &n);
    m = m*n - 1;
    if ((n - 1) % m == 0)
        printf("d = 1\n");
    else
        for (int d = 2, t = n;; d++)
        {
            t *= n;
            printf("d = %d 时 n^d-1 = %d , m = %d , (n^%d-1) %% m = %d\n", d, t - 1, m, d, t % m);
            if ((t - 1) % m == 0)
            {
                printf("d = %d\n", d);
                break;
            }
        }

    return 0;
}


图片附件: 游客没有浏览图片的权限,请 登录注册


题目是错的,即使我用long long型也算不出
2017-03-06 21:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
很明显不能用一般方法咯~要取余数接着算~而不是拿那个大数据算~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-06 22:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 九转星河
玩惯脑筋急转弯就不难了~用long long 应该可以~

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

int main(void)
{
    int m=0;
    int n=0;

    int t=0;

    int i=0;

    printf("请输入m n:");

    scanf("%d%d",&m,&n);

    for (i=1,t=n;n!=1;++i)
    {
        n*=t;
        n%=(m*t-1);
    }

    printf("%d\n",i);

    return 0;
}


[此贴子已经被作者于2017-3-6 22:35编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-06 22:29
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:3 
关键点:不是大数运算就是规避大数运算!
等着有人基于整个出答案~~
2017-03-07 00:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
要规避大数运算的话可以考虑把乘法当作加法分开一步一步算~超出m*n-1则取其余数继续算~

在这个基础上关键是要找到一条余数迭代式--即用上一个余数直接推导出下一个余数而避开两个大数相乘~

当然如果能找到数学公式就有可能一步到位了~不过这只是个猜想而已~

感觉题目m*n-2~应该在int范围内~


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-07 01:14
cdmalcl
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:4091
专家分:524
注 册:2005-9-23
收藏
得分:0 
以下是引用九转星河在2017-3-7 01:14:04的发言:

要规避大数运算的话可以考虑把乘法当作加法分开一步一步算~超出m*n-1则取其余数继续算~

在这个基础上关键是要找到一条余数迭代式--即用上一个余数直接推导出下一个余数而避开两个大数相乘~

当然如果能找到数学公式就有可能一步到位了~不过这只是个猜想而已~

感觉题目m*n-2~应该在int范围内~

数学公式还是首要考虑目标,可惜算法不精,不清楚有没有相关
2017-03-07 04:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感觉可以用double保存数据或者用double百分比来算出余数迭代式~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-07 08:06
快速回复:一道新生赛的题目
数据加载中...
 
   



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

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