[BZOJ5348] 随机数生成器 [GCD?]

[ L i n k \frak{Link} Link]


Description
你有一个随机数生成器,给定一个 0 ≤ x ≤ n − 1 0\le x\le n-1 0xn1 的整数作为随机种子,这个随机数生成器会每次输出 x x x 并将 x k m o d    n xk\mod{n} xkmodn 作为新的 x x x。你很快发现这个随机数生成器很渣。为了证明它很渣,你想要求出有多少个随机种子,使得这个随机数生成器会输出初始种子无穷多次。

Input
输入一行两个正整数n和k。
n ≤ 1 0 18 , k ≤ 1 0 18 n\le10^{18},k\le10^{18} n1018,k1018

Output
输出一个数表示答案。

Sample Input
10 2

Sample Output
4


对于 k r x ≡ x ( m o d n ) k^rx\equiv x\pmod{n} krxx(modn) 其中 0 ≤ x &lt; n 0\le x&lt;n 0x<n 1 &lt; r &lt; n 1&lt;r&lt;n 1<r<n 求合法整数解 x x x 的个数。


变形为 k r ( x , n ) ≡ ( x , n ) ( m o d n ) k^r(x,n)\equiv(x,n)\pmod{n} kr(x,n)(x,n)(modn)
也就是求使 k r ≡ 1 ( m o d n ( x , n ) ) k^r\equiv1\pmod{\frac{n}{(x,n)}} kr1(mod(x,n)n) 有解的 x x x 的个数并加上 x = 0 x=0 x=0 的情况。
这个东西有解当且仅当 ( k , n ( x , n ) ) = 1 (k,\frac{n}{(x,n)})=1 (k,(x,n)n)=1
也就是 ( k , n ) ∣ ( x , n ) (k,n)|(x,n) (k,n)(x,n) ( k , n ) ∣ x (k,n)|x (k,n)x
变换为求满足 ( k , n ) ∣ x (k,n)|x (k,n)x x x x 个数,显然为 ⌊ n − 1 ( k , n ) ⌋ \lfloor\frac{n-1}{(k,n)}\rfloor (k,n)n1


但是呢,我觉得可能是题面出了点偏差
题意跟我想象的 不太一样 (?)
所以下面的代码蛙了
所以我跑了(


#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
long long n, k;
long long gcd(long long a, long long b)
{
	return !b?a:gcd(b,a%b);
}
int main()
{
	scanf("%lld%lld", &n, &k);
	printf("%lld", (n - 1) / gcd(n, k) + 1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值