寒假牛客第四场

E-Applese 涂颜色

题目描述 

寒假牛客第四场_第1张图片

精通程序设计的 Applese 叕写了一个游戏。


在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统计一下有多少种涂色的方法。由于答案很大,你需要将答案对 109+7取模。

输入描述:

仅一行两个正整数 n, m,表示方阵的大小。

输出描述:

输出一个正整数,表示方案数对 109+7 取模。

示例1

输入

复制

1 1

输出

复制

2

示例2

输入

复制

2 2

输出

复制

4

备注:

1≤n,m≤10100000

题意:这个题题意很好懂,每行有2种方法,n行就是2^n次方,只是n的范围是10^100000,

所以要用到大数,并且要降幂,这里需要用到费马小定理:

 假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(mod p),例如:假如a是整数,p是质数,则a,p显然互质(即两者只有一个公约数1),那么我们可以得到费马小定理的一个特例,即当p为质数时候, a^(p-1)≡1(mod p)。

所以如果n>1e9+7,   2^(1e9+7-1)%1e9+7是1,可以不用计算,只需计算n-(n/(1e9+7-1))*1e9+7-1,

再用快速幂即可。

附上我java拙劣的代码,

另外看Python3的一行代码是很厉害,但是正规比赛也不让用,就不在学习了

import java.math.*;
import java.util.*;
public class Main
{
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        BigInteger n,m;
        BigInteger ans = new BigInteger(Integer.toString(1));
        BigInteger mod=new BigInteger(Integer.toString(1000000007));
         BigInteger t = new BigInteger("1");
        BigInteger k=new BigInteger("2");
        BigInteger mo=new BigInteger("0");
        BigInteger p=new BigInteger("2");
        BigInteger f=new BigInteger("0");
        while(cin.hasNext()){
            n=cin.nextBigInteger();
            m=cin.nextBigInteger();
            if(n.compareTo(mod)>=0){
                f=n.divide(mod.subtract(t));
                n=n.subtract(f.multiply(mod.subtract(t)));
            }
            while(n.compareTo(mo)>0){
                t=n.remainder(p);
                if(t.compareTo(mo)>0){
                    ans=ans.multiply(k);
                    ans=ans.remainder(mod);
                }
                k=k.multiply(k);
                k=k.remainder(mod);
                n=n.divide(p);
            }
                System.out.println(ans);
            }
        }
    }

I-Applese 的回文串
 

题目描述

寒假牛客第四场_第2张图片

自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。


这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。

如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?

输入描述:

仅一行,为一个由字母和数字组成的字符串 s。

输出描述:

如果在插入一个字符之后可以构成回文串,则输出"Yes", 否则输出"No"。

示例1

输入

复制

applese

输出

复制

No

示例2

输入

复制

java

输出

复制

Yes

备注:

|s|≤105

题意:找回文串,首先如果本身就是回文串,其次如果本身不是,那么可以按照题意遍历每一个位置判断如果加上一个是不是回文串,然后T了。。。

其实反过来想,加上一个,就相当于对应位置删去一个,这样就简洁多了

#include
#define exp 1e-8
#define mian main
#define pii pair
#define pll pair
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
string s;
int check(const string &t)
{
    for(int i=0;i>s){
            int p=check(s);
            if(p==-1){
                printf("Yes\n");
                return 0;
            }
            else {
                string s3=s;
                string s1=s.erase(p,1);
                string s2=s3.erase(s3.length()-p-1,1);
                if(check(s1)==-1||check(s2)==-1)
                   printf("Yes\n");
                   else printf("No\n");
            }
    }
}

 

你可能感兴趣的:(训练)