今天,老师“命令”我们做洛谷题
首先是2626,网址放在这,复制search就行了https://www.luogu.com.cn/problem/P2626
题目是让我们先算斐波那契数列第n项,再分解质因数。
我没多想,直接写代码//这是错误答案,倒在了48上,是WA
#include<bits/stdc++.h>
using namespace std;
int fenjie(long long a){
long long temp=a;
long long x=2;
while(temp!=1){
while(temp%x==0){
temp/=x;
if(temp!=1){
cout<<x<<'*';
}else cout<<x;
}
x++;
}
return 0;
}
int main(){
long long a[50]={0};//初始化
long long n;
cin>>n;
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++){
a[i]=(a[i-1]+a[i-2])%(int)pow(2.0,31.0);
}
cout<<a[n]%(int)pow(2.0,31.0)<<'=';
fenjie(a[n]%(int)pow(2.0,31.0));
return 0;
}
然后,我仔细分析了一下,发现有特殊情况1的分解质因数,而且pow(2.0,31.0)就等于1+(long long)INT_MAX
于是第二批次出来了
#include<bits/stdc++.h>
using namespace std;
int fenjie(long long a){
if(a==1){
cout<<1;
return 0;
}
long long temp=a;
long long x=2;
while(temp!=1){
while(temp%x==0){
temp/=x;
if(temp!=1){
cout<<x<<'*';
}else cout<<x;
}
x++;
}
return 0;
}
int main(){
long long a[50]={0};//初始化
long long n;
cin>>n;
a[1]=1;
a[2]=1;
for(int i=3;i<=n;i++){
a[i]=(a[i-1]+a[i-2])%(1+(long long)INT_MAX);
}
cout<<a[n]%(1+(long long)INT_MAX)<<'=';
fenjie(a[n]%(1+(long long)INT_MAX));
return 0;
}
AC了
紧接着,就是第二道“送分题”1029
可以直接跳转去那儿https://www.luogu.com.cn/problem/P1029
这题不难,只要会最大公约数的代码∪知道两个数的最大公约数与最小公倍数的乘积等于两数乘积就基本上能ac了
代码放这,需要可借鉴,顺便给下福利,__gcd可以直接算最大公约数,系统自带但是NOIP不准用
#include<bits/stdc++.h>
using namespace std;
int main(){
int p,q,sum=0;//p为最大公约数,q为最小公倍数
cin>>p>>q;
for(int i=p;i<=q;i++){
if(i%p==0&&q%i==0){
int j=p*q/i;
if(__gcd(i,j)==p) sum++;//ij的最大公约数符合了,最小公倍数也一定符合,不信可以证明一下
}
}
cout<<sum;
return 0;
}
最后,就是这魔鬼的第三题5016了https://www.luogu.com.cn/problem/P5016
大佬们可以去尝试一下,虽然只是普及-的
这道题题目较为复杂,如果读题的前五分钟没思路,那么你这道题就看不懂了
这道题给了我深深的教训,做题时,一定要边做题边写注释啊!!!
然后呢,这道题大概的思路是这样的:
先把天降的神兵记到总战力里面去,然后计算龙队和虎队的战力,再根据这个战力值调兵,最后注意数据范围,应该用long long。
第一次写,wonderful answerWA了五个点
代码在这
#include<iostream>
using namespace std;
long long c[100001],n,m,s1,p1,s2;//n:兵营数,m:分界,c:兵营的工兵数,s1:天降的神兵数
//p1:神兵的兵营,s2:需派出的工兵数
long long abs(long long a){
if(a<0) return 0-a;
return a;
}
long long dragon,tiger;
long long minn=1000000001,minplace;
int main(){
cin>>n;
for(long long i=1;i<=n;i++) cin>>c[i];
cin>>m>>p1>>s1>>s2;
c[p1]+=s1;
for(int i=1;i<m;i++) dragon+=c[i]*abs(i-m);
for(int i=m+1;i<=n;i++) tiger+=c[i]*abs(i-m);
for(int i=1;i<=m;i++){
int newdragon=dragon+s2*abs(i-m);
if(abs(newdragon-tiger)<minn){
minn=abs(newdragon-tiger);
minplace=i;
}
}
for(int i=m+1;i<=n;i++){
int newtiger=tiger+s2*abs(i-m);
if(abs(newtiger-dragon)<minn){
minn=abs(newtiger-dragon);
minplace=i;
}
}
cout<<minplace;
return 0;
}
然后,我就用方程法重做了这道题,answer cluptionAC了
代码在这
#include <bits/stdc++.h>
inline long long read () {
register long long x = 0 , ch = getchar();
while( !isdigit(ch)) ch = getchar();
while( isdigit(ch) ) x = x * 10 + ch - '0' , ch = getchar();
return x;
}
inline long long abs (long long x) {
if(x >= 0) return x;
return -x;
}
long long m, p1, s1, s2, a[1000005], t1, t2;
int n;
int main () {
double where;
long long gap;
n = read();
for(int i = 1; i <= n; i ++ ) {
a[i] = read();
}
m = read();
p1 = read();
s1 = read();
s2 = read();//这些都是快读,不用管
a[p1] += s1;
for(int i = 1; i <= n; i ++ ) {
gap += (m - i) * a[i];
}
double dgap = gap;
long long int ans;
where = m + dgap / s2;//方程的解
if(where >= n) {//大于等于n的情况
ans = n;
}
else if(where <= 1)//小于等于1的情况
ans = 1;
else {
int iwhere = where;//判断是不是整数
if(iwhere == where) ans = iwhere;//如果是整数
else {
long long ans1 = abs(gap + (m - iwhere ) * s2);
long long ans2 = abs(gap + (m - iwhere - 1) * s2);//分别计算把s2个工兵放在向下取整和向上取整两个兵营里之后的势力之差
ans = ans1 <= ans2 ? iwhere : iwhere + 1;//三目运算符
}
}
printf("%lld", ans);//答案输出
return 0;
}
好啦,不得不说一句,这代码段我是第一次发现编程真是神通广大啊!