BestCoder Round #80 待填坑

Lucky

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1443    Accepted Submission(s): 767


Problem Description
    Chaos August likes to study the lucky numbers.

    For a set of numbers S,we set the minimum non-negative integer,which can't be gotten by adding the number in S,as the lucky number.Of course,each number can be used many times.

    Now, given a set of number S, you should answer whether S has a lucky number."NO" should be outputted only when it does have a lucky number.Otherwise,output "YES".
 

 

Input
    The first line is a number T,which is case number.

    In each case,the first line is a number n,which is the size of the number set.

    Next are n numbers,means the number in the number set.

    1n105,1T10,0ai109.
 

 

Output
    Output“YES”or “NO”to every query.
 

 

Sample Input
1 1 2
 

 

Sample Output
NO
 
只要有0和1就行了;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == '-') f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }

/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/

int T;
int n;
int a[maxn];


int main() {
	//ios::sync_with_stdio(0);
	rdint(T);
	while (T--) {
		rdint(n); bool fg1 = false, fg2 = false;
		for (int i = 1; i <= n; i++) {
			rdint(a[i]);
			if (a[i] == 1)fg1 = true;
			if (a[i] == 0)fg2 = true;
		}
		
		if (fg1&&fg2)cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}

 

Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2913    Accepted Submission(s): 976


Problem Description
    Holion August will eat every thing he has found.

    Now there are many foods,but he does not want to eat all of them at once,so he find a sequence.

fn=1,ab,abfcn1fn2,n=1n=2otherwise

    He gives you 5 numbers n,a,b,c,p,and he will eat fn foods.But there are only p foods,so you should tell him fn mod p.
 

 

Input
    The first line has a number,T,means testcase.

    Each testcase has 5 numbers,including n,a,b,c,p in a line.

    1T10,1n1018,1a,b,c109,p is a prime number,and p109+7.
 

 

Output
    Output one number for each case,which is fn mod p.
 

 

Sample Input
1 5 3 3 3 233
 

 

Sample Output
190
 
1e18,必须得logn的算法;
快速幂!
前几项手算可以发现;
最后的结果都有a^b;那么我们先不看这个;
除这个以外,还有一个多项式;
不妨设为g(n);
可以发现 g(n)=c*g(n-1)+g(n-2)+1;
------> 矩阵快速幂;
构造则非常简单了;
由于我们fn=a^x mod p;
由费马小定理: a^x = a^( x mod ( p-1) )mod p;
所以对于指数这一项,我们可以降幂;
那么问题就解决了;
其实就是快速幂套一个快速幂的问题;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == '-') f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }

/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/

int T;
ll n, a, b, c, p;

struct mat {
	ll m[3][3];
	mat() { ms(m); }
};

mat operator *(mat a, mat b) {
	mat c;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			for (int k = 0; k < 3; k++)
				c.m[i][j] += (a.m[i][k] * b.m[k][j]) % (p - 1);
		}
	}
	return c;
}

mat qpow(mat a, ll b) {
	mat c;
	for (int i = 0; i < 3; i++)c.m[i][i] = 1;
	while (b) {
		if (b & 1)c = c * a;
		a = a * a; b >>= 1;
	}
	return c;
}

ll qpow(ll a, ll b) {
	ll ans = 1;
	ll tmp = a;
	while (b) {
		if (b % 2)ans = (ans * tmp) % p; tmp = (tmp*tmp) % p; b >>= 1;
	}
	return ans;
}
int main() {
	//ios::sync_with_stdio(0);
	rdint(T);
	while (T--) {
		cin >> n >> a >> b >> c >> p;
		if (n == 1)cout << 1 << endl;
		else if (n == 2)cout << qpow(a, b) << endl;
		else if (a%p == 0)cout << 0 << endl;
		else {
			mat tmp;
			tmp.m[0][0] = c; tmp.m[0][1] = 1; tmp.m[0][2] = 1;
			tmp.m[1][0] = 1; tmp.m[2][2] = 1;
			mat ans = qpow(tmp, n - 2);
			ll res = (ans.m[0][0] % (p - 1) + ans.m[0][2] % (p - 1))*b % (p - 1);
			cout << qpow(a, res) << endl;
		}
	}
	return 0;
}

 

Segment

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2422    Accepted Submission(s): 896


Problem Description
    Silen August does not like to talk with others.She like to find some interesting problems.

    Today she finds an interesting problem.She finds a segment x+y=q.The segment intersect the axis and produce a delta.She links some line between (0,0) and the node on the segment whose coordinate are integers.

    Please calculate how many nodes are in the delta and not on the segments,output answer mod P.
 

 

Input
    First line has a number,T,means testcase number.

    Then,each line has two integers q,P.

    q is a prime number,and 2q1018,1P1018,1T10.
 

 

Output
    Output 1 number to each testcase,answer mod P.
 

 

Sample Input
1 2 107
 

 

Sample Output
0
 
sum=(q-1)*(q-2)/2;
用快速乘防止爆longlong;当然用 java也可;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {
	ll x = 0;
	char c = getchar();
	bool f = false;
	while (!isdigit(c)) {
		if (c == '-') f = true;
		c = getchar();
	}
	while (isdigit(c)) {
		x = (x << 1) + (x << 3) + (c ^ 48);
		c = getchar();
	}
	return f ? -x : x;
}

ll gcd(ll a, ll b) {
	return b == 0 ? a : gcd(b, a%b);
}
ll sqr(ll x) { return x * x; }

/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {
	if (!b) {
		x = 1; y = 0; return a;
	}
	ans = exgcd(b, a%b, x, y);
	ll t = x; x = y; y = t - a / b * y;
	return ans;
}
*/

int T;
ll p;
inline ll qpow(ll a, ll b) {
	ll ans = 0;
	while (b) {
		if (b & 1)ans = (ans + a) % p;
		b >>= 1; a = (a + a) % p;
	}
	return ans;
}
int main() {
	//ios::sync_with_stdio(0);
	rdint(T);
	while (T--) {
		ll q; cin >> q >> p;
		if ((q - 1) % 2 == 0)cout << qpow((q - 1) / 2, (q - 2)) << endl;
		else cout << qpow((q - 2) / 2, (q - 1)) << endl;
	}
	return 0;
}

 

posted @ 2018-12-29 21:09  NKDEWSM  阅读(154)  评论(0编辑  收藏  举报