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

Posted squirrel-vae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了表达式(打表AC大法(滑稽))相关的知识,希望对你有一定的参考价值。

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

 

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

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

打出来发现是这样的(未取余):

91 195 312 442 585 741 (k = 1~6)

然而,这是什么规律??技术图片

发现它们都能除13.

开心的把它们都除了13:

7 15 24 34 45 37 是不是已经发现规律了?

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

于是大胆假设这个规律

对于一个质数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) << ‘
‘;
	}
	else putchar ((k & 1) + ‘0‘), putchar (‘
‘);
	return 0;
}

  

以上是关于表达式(打表AC大法(滑稽))的主要内容,如果未能解决你的问题,请参考以下文章

[打表] aw3734. 求和(打表+dfs+区间交集+aw周赛006_2)

dp uoj370 滑稽树上滑稽果

真假签到题(签到+打表)

ACM-ICPC 2018 焦作赛区网络预赛 I题(滑稽)

[20211217]滑稽可笑的程序代码2.txt

统计难题HDU - 1251map打表或字典树字典树模板