zoukankan      html  css  js  c++  java
  • 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;
    }
    
    EPFL - Fighting
  • 相关阅读:
    Java-技术专区-JVM调优常用参数
    Alibaba-技术专区-Dubbo的SPI应用与原理
    Java-技术专区-深入理解SPI机制
    Alibaba-技术专区-Dubbo SPI扩展点加载机制
    Java-技术专区-线程基础
    Java-技术专区-精巧好用的DelayQueue
    Alibaba-技术专区-Sentinel流量降级监控
    Java-技术专区-Java线程池ThreadPoolExecutor的理解
    SpringCloud-技术专区-SpringCloud组件原理
    机器码和伪指令
  • 原文地址:https://www.cnblogs.com/zxyqzy/p/10197938.html
Copyright © 2011-2022 走看看