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".
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.
1≤n≤105,1≤T.
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.
1≤n≤105,1≤T.
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.
f
He gives you 5 numbers n,a,b,c,p,and he will eat f foods.But there are only p foods,so you should tell him f mod p.
Now there are many foods,but he does not want to eat all of them at once,so he find a sequence.
f
He gives you 5 numbers n,a,b,c,p,and he will eat f foods.But there are only p foods,so you should tell him f 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.
1≤T,p is a prime number,and p≤109+7.
Each testcase has 5 numbers,including n,a,b,c,p in a line.
1≤T,p is a prime number,and p≤109+7.
Output
Output one number for each case,which is f 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.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.
Today she finds an interesting problem.She finds a segment x+y.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 2≤q
Then,each line has two integers q,P.
q is a prime number,and 2≤q
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; }
EPFL - Fighting