列表

详情


NC19877. [AHOI2007]密码箱

描述

在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示。经过艰苦的破译,小可可发现,这些图标表示一个数以及这个数与密码的关系。假设这个数是n,密码为x,那么可以得到如下表述: 密码x大于等于0,且小于n,而x的平方除以n,得到的余数为1。 小可可知道满足上述条件的x可能不止一个,所以一定要把所有满足条件的x计算出来,密码肯定就在其中。计算的过程是很艰苦的,你能否编写一个程序来帮助小可可呢?(题中x,n均为正整数)

输入描述

输入文件只有一行,且只有一个数字n(1 ≤ n ≤ 2,000,000,000)。

输出描述

你的程序需要找到所有满足前面所描述条件的x,如果不存在这样的x,你的程序只需输出一行“None”(引号不输出),否则请按照从小到大的顺序输出这些x,每行一个数。

示例1

输入:

12

输出:

1
5
7
11

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 1658ms, 内存消耗: 10552K, 提交时间: 2023-03-16 19:07:48

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        long n = sc.nextInt();
        for(long i = 1; i < n; i++){
            if(i*i % n == 1)System.out.println(i);
        }
    }
}

C++(clang++ 11.0.1) 解法, 执行用时: 540ms, 内存消耗: 384K, 提交时间: 2023-07-26 11:36:45

#include<bits/stdc++.h>
using namespace std;

typedef long long ll;

int main()
{
	ll n; cin >> n;
	for (ll i = 0; i < n ; i++)
	{
		ll x = sqrt(i * n + 1);
		if(x * x == i * n + 1)
		cout << x << endl;
	}
	return 0;
}

C(clang11) 解法, 执行用时: 497ms, 内存消耗: 348K, 提交时间: 2022-04-16 18:22:44

 #include<stdio.h>
int main(){
    long long n,i,k;
    scanf("%lld",&n);
    for(i=0;i<n;i++){
      k=sqrt(1+n*i);
        if(k>n||k<0)break;
        if (k*k==1+n*i)
            printf("%d\n",k);
        
    }
}

上一题