列表

详情


NC207433. 财富密码

描述

“我们厦大的ACM实在是太厉害了”
在我校无数的菜鸡中,这句话打开了财富之门,因此被称为财富密码。
事实上,关于密码学的研究里面有很多涉及到数论的知识,以下就是一道例题。
求有多少整数满足,其中p是一个质数。
看到这里你可能认为我会解释上述符号的意思,然而如果你看不懂上面的式子,那么我不建议你尝试这道题目,所以这里没有解释。

输入描述

每个测试点仅包含一组输入数据。
第一行,四个以空格隔开的正整数,分别表示

输出描述

一个正整数,符合条件的n的个数。

示例1

输入:

2 3 5 8

输出:

2

原站题解

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

C++14(g++5.4) 解法, 执行用时: 59ms, 内存消耗: 8300K, 提交时间: 2020-05-30 18:37:53

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e6+5;
ll a,b,p,x,ans=0,res[maxn];
int main(void)
{	
    cin>>a>>b>>p>>x;
    res[p-1]=b;
    for(int i=p-2;i>=0;i--){
    	res[i]=res[i+1]*a;
    	res[i]%=p;
	}
    for(int i=0;i<p-1;i++){
    	ll t=res[i]+p*(i-res[i]+2*p-2);
    	t%=p*(p-1);
        ans+=((x-t+(p*(p-1)))/(p*(p-1)));
    }
    cout<<ans<<"\n";
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 36ms, 内存消耗: 404K, 提交时间: 2020-10-08 11:28:27

#include<bits/stdc++.h>
using namespace std;
long long a, b, p, x, t, xx, ans = 0, v = 1, i, m;
int main()
{
	cin >> a >> b >> p >> x;
	ans = 0, v = 1;
	for (i = 1; i <= p - 2; i++) v = v*a%p;
	m = p*(p - 1);
	for (i = 0; i<p - 1; i++)
	{
		t = (i - b) % (p - 1);
		if (t<0) t += p - 1;
		xx = b + p*t;
		ans += x / m;
		if (x%m >= xx) ans++;
		b = b*v%p;
	}
	cout << ans << endl;
}

上一题