Ozon Tech Challenge 2020 (Div.1 + Div.2) C. Kuroni and Impossible Calcula(快速乘+特判)

http://codeforces.com/contest/1305/problem/C

需要有個特判,n>m的時候直接輸出0,

透,就差這一步,一直T,後來發現加了個特判直接過了,後悔死了

其他的我就用了個快速乘

#include <iostream>
#include<bitset>
#include <algorithm>
#include <cmath>
#include <ctype.h>
#include <cstring>
#include <cstdio>
#include <set>
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include<iomanip>
#define SIS std::ios::sync_with_stdio(false)
#define ll long long
#define INF 0x3f3f3f3f
const int mod = 1e9 + 7;
const double esp = 1e-5;
const double PI = 3.141592653589793238462643383279;
using namespace std;
const int N = 1e7 + 5;
const int maxn = 1 << 20;
ll powmod(ll a, ll b) { ll res = 1; a %= mod; while (b >= 0); for (; b; b >>= 1) { if (b & 1)res = res * a % mod; a = a * a % mod; }return res; }
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
/*void chafen(int l, int r, int k) {//差分函數
	p[l] += k;
	p[r + 1] -= k;
}*/
ll fastMul(ll a, ll b, ll p) {//快速乘
	a %= p;
	ll ans2 = 0;
	while (b > 0) {
		if (b & 1)
			ans2 = (ans2 + a) % p;
		b >>= 1;
		a = (a + a) % p;
	}
	return ans2;
}
ll modMul(ll a, ll b, ll p)//極限快速乘
{
	if (p <= 1000000000)
		return a * b % p;
	else if (p <= 000000000000ll)
		return (((a * (b >> 20) % p) << 20) + (a * (b & ((1 << 20) - 1)))) % p;
	else {
		ll d = (ll)floor(a * (long double)b / p + 0.5);
		ll ret = (a * b - d * p) % p;
		if (ret < 0) ret += p;
		return ret;
	}
}
/*************************************************************/
int a[N], b[N],c[N];
int main() {
		int n;
		ll m;
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		ll ans = 1; ll ans1 = 0;
		if (n == 2) {
			cout << abs(a[1] - a[2]) % m << endl;
		}
		else if (n > m)
			cout << 0 << endl;
		else 
		{
		    for(int i=1;i<=n;i++)
			   for (int j = i+1; j <= n; j++) {
				   ans1 = abs(a[i] - a[j])%m;
				   //cout << ans1 << " ";
				   ans = fastMul(ans, ans1, m);//極限快速乘也可以,而且更快
			}
		cout << ans << endl;
		}

	return 0;
}
/*

*/

還有一個代碼感覺也得記一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章