• HDU1395 2^x mod n = 1——积与余数的性质


    对于数论的学习比较的碎片化,所以开了一篇随笔来记录一下学习中遇到的一些坑,主要通过题目来讲解

    本题围绕:积与余数

    HDU1395 2^x mod n = 1

    题目描述

    输入一个数n,如果存在2的x次方mod输出的n余数为1,则输出2^x mod n = 1,否则输出2^? mod n = 1,其中n替换为每次输出的n的具体数值

    输入

    正整数n,读取到文件尾

    输出

    2^x mod n = 1或者2^? mod n = 1

    样例输入

    2
    5

    样例输出

    2^? mod 2 = 1 
    2^4 mod 5 = 1

    题目分析

    对于本题,要注意的点有:首先对于x的范围题目是没有给出的,所以不能想当然的假设把2^x设定在int或者long long的范围内用空间换时间的方法去做(对不起我踩坑了),再者,对于本题有一个概念性的知识点:多个数的积取余数等于这几个数分别取余数后的积的余数(几个数积的余数等于这几个数的余数的积的余数),这个概念可以使我们对一些情况进行优化,使得在计算很大的数的余数的时候不会溢出

    代码:

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 
     5 int main(){
     6     int n;
     7     while(scanf("%d", &n) != EOF){
     8         if(n == 1 || n % 2 == 0) printf("2^? mod %d = 1
    ", n);        //偶数mod偶数余数不可能为1 任何数mod1 == 0 
     9         else{
    10             int x = 1;
    11             int ans = 0;
    12             while(true){            //每次都将x * 2,然后对于x mod n(几个数积的余数等于这几个数余数的积的余数) 
    13                 x *= 2;                //这样使得在数很大的时候不会溢出 
    14                 ans++;
    15                 if(x % n == 1){
    16                     printf("2^%d mod %d = 1
    ", ans, n);        
    17                     break;
    18                 }else{
    19                     x %= n;
    20                 }
    21             }
    22         }
    23     }
    24     return 0;
    25 }
    如果有任何意见请在评论区积极留言
  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/YLTFY1998/p/11338973.html
Copyright © 2020-2023  润新知