链接:https://ac.nowcoder.com/acm/contest/3036/I
来源:牛客网
题目描述
圣杯能召唤过去,现在甚至未来的各种英灵。想必也有不同世界的英灵会被召唤,所以才会有对圣杯的不断响应吧。为了修复过去的错误。为了重新选择。
「吾名奥德修斯,为七骑之中的狂战士(berserker)」面前的怪物开口了,虽然具有人形,但却没有一点人的感觉。更像是失控的野兽。
「还保有理智吗」
「是的」怪物没有过多的行动「开门见山吧,吾辈是没有战胜魔女喀耳刻的奥德修斯。我不曾再见过我的妻儿,被魔女任意改造成可怕的怪物。因为同为奥德修斯而被记录在英灵座上的怪物罢了。我不打算和你们动手,但你们必须回答我的问题,才能离开。无法得到答案,连我也无法离开这个迷宫」
「请说」
「迷宫的一个岔口对应一个谜题,而这些谜题的答案都是由一个公式计算得到的,这个公式就是(p-1)n % p。每个岔口都有对应的p和n,而且p必定为一个素数。带着我,只要你计算出正确答案,我就能告诉你正确的前进方向」它起身了
「我明白了」虽然它给我感觉是失控的野兽,但却毫无危险的感觉
输入描述:
第一行输入一个整数T (1<=T<=5),代表有T个样例,
对于每组样例,输入一行,每行输入一个质数p (2<=p<=
1
0
9
10^9
109)和一个整数n (0<=n<
1
0
1000001
10^{1000001}
101000001 )。
输出描述:
对于每一组样例,输出(p-1)n % p
(注:’%'是取模运算符,也叫取余运算符,比如:8 % 3 = 2,因为8除于3的余数是2。更详细的说:因为8 = 23 + 2,前一部分 "23" 是3的倍数,后一部分 “2” 是小于3的数,后一部分就是8 % 3的结果)
示例1
输入
2 1
2 2
输出
1
1
说明
提示:n会很大,请不要试图使用int和long long存,要用char数组存。另外,请不要执行1e7次及以上的取模运算,否则超时。
输入输出代码(参考):
#include <stdio.h>
char n[1000005];
int main(){
int T;
scanf("%d", &T);
for(int t = 1; t <= T; t++){
int p;
scanf("%d %s", &p, n);
//...;
//printf...;
}
return 0;
}
思路
再做上一道同样数据量较大的题目时
有一位学长给了我一点指导
所以我就先把前面的数据打印出来查看规律
于是可以发现如果 n 是奇数的话,
(
p
−
1
)
n
(p -1)^n
(p−1)n对 p 取模,结果还是 p - 1;如果是偶数的话,结果就是 1 。
我觉得跟p是质数(素数)应该是有关系的
然后就用最近学的queue容器(本来想用string的,但是没用过,就不敢用)
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
using namespace std;
int main() {
int t;
scanf("%d", &t);getchar();
vector<char>a, b;
char c;
while (t--) {
a.clear(), b.clear();
while ((c = getchar()) != ' ') a.push_back(c);
while ((c = getchar()) != '\n') b.push_back(c);
if (b[b.size() - 1] % 2 == 0) printf("1\n");
else {
if (a[a.size() - 1] == '0') {
a[a.size() - 2] -= 1;
a[a.size() - 1] = '9';
}
else a[a.size() - 1] -= 1;
a.push_back('\0');
printf("%s\n", &a[0]);
}
}
return 0;
}
总结
学长说的如果遇到数据量很大的题目,可以试着先将一小部分数据打印出来观察是否有规律再进行接下来的操作非常的好用,给他点赞哦