表达式(打表AC大法(滑稽))

求  的值,其中,k,p均为不超过109的正整数。其中保证p是质数。

 

一看到这种数论题,我就想:打表吧!

于是任取一个质数13,k为1,2,3,4……

打出来后发现:

好像找到一些规律

换了一个质数,发现它们都满足这个规律

于是大胆假设这个规律

对于一个质数p,第k项是首项为(p+1)/2,公差为1的等差数列的前缀和。

而且还发现若k>(p+1)/2,则它对p2取余后和第p-k项相等。(你们可以自行验证)

然后对于p=2特判一下即可。 代码如下:

#include <cstdio>
#include <iostream>
using namespace std;

inline void read (int& s) {
	s = 0;
	static char c = getchar ();
	while (c < '0' || c > '9') c = getchar ();
	while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c & 15), c = getchar ();
	return ;
}

typedef long long ll;
ll k, p, MOD;

inline ll mult (ll p, ll x) {
	ll s = 0;
	while (x) {
		if (x & 1) s = (s + p) % MOD;
		p = (p + p) % MOD;
		x >>= 1;
	}
	return s;
}

int main () {
	cin >> k >> p;
	MOD = 1ll * p * p;
	if (p & 1) {
		k %= p; 
		if (k > p / 2) k = p - k;
		ll a = p + 1 >> 1;
		ll x = k * a % MOD;
		ll y = k * (k - 1) / 2;
		x = (x + y) % MOD;
		cout << mult (x, p) << '\n';
	}
	else putchar ((k & 1) + '0'), putchar ('\n');
	return 0;
}

附上某位不知名大佬的证明:

链接:https://blog.csdn.net/qq_39565901/article/details/82953926

posted @ 2019-09-27 21:29  Squirrel&Vae  阅读(251)  评论(0)    收藏  举报