将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 ×2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) {
long a1 = 7385137888721L + (long)10470245L/4;
long i;
for(i = 1l;i*i<=a1;i++) {
}
// out.println(i*i-7385137888721L);
out.println((i-1)*2);
out.flush();
}
}
往简单了想,想不出来就看看小范围内的规律
可以先小范围的写1-10观察规律!!
首先一个奇数一定可以写成两项相加的形式,所以奇数一定有诗意
所以只要一个数有奇数因子那么就有诗意 它可以看作一个奇数✖倍数
这说明了如果一个数没有奇数因子 那么就没有诗意 那么什么数没有奇数因子呢?只能是偶数,而且是特殊的偶数 是2的倍数 才能做到没有一个奇数因子
所以这一题就转化成了2的整数倍的数没有诗意 那么答案就是数组中2的整数倍的数的个数!!
差分 + 贪心
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static int n;
static int[] a;
static int[] b;
public static void main(String[] args) throws IOException {
n = Integer.parseInt(in.readLine());
String[] p = in.readLine().split(" ");
a = new int[n+1];
b = new int[n+1];
for(int i=1;i<=n;i++) {
a[i] = Integer.parseInt(p[i-1]);
}
for(int i=1;i<=n/2;i++)b[i] = a[n-i+1] - a[i];
int ans = 0;
for(int i=1;i<=n/2;i++) {//只转化左边与右边相同即可
//只改变a[i]使之相同
ans += Math.abs(b[i]);
if(b[i]*b[i+1]>0) {//同号 下一个数要操作的次数更多
if(Math.abs(b[i+1])>Math.abs(b[i])) b[i+1]-=b[i];
else i++;//更小的话直接跳过下一个数 结束的时候还会再++一次
}
}
out.println(ans);
out.flush();
}
}
博弈论 线性规划
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;
public class Main{
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
static int t;
static int N = (int)1e5+6;
static ArrayList<Integer> primes = new ArrayList<Integer>();
static int[] is_p = new int[N];//0表示是质数 1表示不是质数
static int[] sta = new int[N];//0表示先手必输 1表示先手必赢
public static void judge_prime(int x) {
is_p[0] = 1;
is_p[1] = 1;//0和1都不是质数
for(int i=2;i<=x;i++) {
if(is_p[i]==0)primes.add(i);
for(int prime:primes) {
if(i*prime>x)break;//这一句一定要加否则会导致数组越界
if(is_p[i*prime]==0)is_p[i*prime] = 1;//置为1
if(i%prime==0)break;
}
}
}
public static boolean judge_index(int x) {
return (x>=0&&x<N?true:false);
}
public static void main(String[] args)throws IOException{
t = Integer.parseInt(in.readLine());
judge_prime(N-2);
//质数或者质数+1 是 先手必赢
for(int prime:primes) {
sta[prime] = 1;
sta[prime+1] = 1;
}
for(int i=1;i<=1e5;i++) {//对于每一个木头的长度
for(int prime:primes) {
if(judge_index(i-prime)==false)continue;//不合法范围的话不行
if(prime>i)break;
if(sta[i-prime]==1)continue;//如果先手砍了一个之后是先手必赢 那么就是先手必输
else {//只需要有一个能让先手必赢 那么就可以说这种情况先手必赢
sta[i] = 1;
break;
}
}
}
for(int i=1;i<=t;i++) {
int len = Integer.parseInt(in.readLine());
out.println(sta[len]);
}
out.flush();
}
}