题目描述
精通程序设计的 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);
}
}
}
题目描述
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。
如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
输入描述:
仅一行,为一个由字母和数字组成的字符串 s。
输出描述:
如果在插入一个字符之后可以构成回文串,则输出"Yes", 否则输出"No"。
示例1
输入
复制
applese
输出
复制
No
示例2
输入
复制
java
输出
复制
Yes
备注:
|s|≤105
题意:找回文串,首先如果本身就是回文串,其次如果本身不是,那么可以按照题意遍历每一个位置判断如果加上一个是不是回文串,然后T了。。。
其实反过来想,加上一个,就相当于对应位置删去一个,这样就简洁多了
#include<bits/stdc++.h>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#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<x>
#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<t.length();i++)
if(t[i]!=t[t.length()-i-1])
return i;
return -1;
}
int main()
{
while(cin>>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");
}
}
}