CF1912D 题解
思路
通过观察数据学习小学奥数我们可以知道,若可以取后 位来判断,则 ;若需要 位一节相加来判断,则 ;若需要 位一节并且交替加减来判断,则 。如果 已经进入循环了还没出答案,则无解。若对这三个式子有疑问则可自己手动列竖式理解。
代码
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int t, n, m, x;
bitset <1000005> vis;
int main () {
ios::sync_with_stdio (0);
cin.tie (0);
cout.tie (0);
cin >> t;
while (t --) {
cin >> m >> n;
x = 1;
m %= n;
for (int i = 0; i < n; ++ i)
vis[i] = 0;
for (int k = 1; ! vis[x = x * (ll) m % n]; ++ k) {
if (! x) {
cout << "1 " << k << '\n';
goto there;
} else if (x < 2) {
cout << "2 " << k << '\n';
goto there;
} else if (x > n - 2) {
cout << "3 " << k << '\n';
goto there;
}
vis[x] = 1;
}
cout << "0\n";
there:
;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?