纳米猫猫
昨天做的一道“签到题”,涉及到大数取余和循环节记录一下。
高阶幂但是取模很小,用循环节把每一次乘法运算之后的数存储。之后大数取模即可。
//x为底数,每做一次乘法乘一个x
//ll vis[1010];全局变量,因为mod<=1000,所以最多乘1000次,循环节的长度最大为1000
//vis[i]表示乘了vis[i]次得到i,nums[i]表示乘了i次得到nums[i]
nums.push_back(1);
vis[1] = 0;
for (i = 1; i <= 1010; i++) {
sum = sum * x % mod;
if (vis[sum])break;
vis[sum] = i;
nums.push_back(sum);
}
大数取余函数:
//大数取余
ll longMod(string s, ll mod) {
int ans = 0;
for (int i = 0; i < s.length(); i++) {
int x = s[i] - '0';
ans = (((ans * 10) % mod) + (x % mod)) % mod;
}
return ans;
}
完整代码:
#include <iostream>
//#include "bits/stdc++.h"
#include "algorithm"
#include "cstring"
#include "vector"
#include "stack"
#include "queue"
#include "set"
#include "cmath"
#include "unordered_map"
#include "map"
#include "sstream"