A
斐波那契数列在存到i=50的时候就爆炸了,没有数组能够存下,虽然会溢出,但是可以比较后边的几位,故都设置为ull类型,遍历一下也就1e5,记得输入用字符串,数据和位置的对应可以用map《数组,int》。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int N = (int) 100000 + 11;
const int M = (int) 1e6 + 11;
const int MOD = (int) 1e9 + 7;
const int INF = (int) 0x3f3f3f3f;
ull f[N]={0,1};
map<ull, int> mp;
int main(){
mp[1] = 1; mp[0] = 0;
for(int i = 2; i < N; i++){
f[i] = f[i-1] + f[i-2];
mp[f[i]] = i;
}
int T; cin>>T;
while(T--){
string s; cin>>s;
ull ans=0;
for(int i = 0; s[i]; i++) ans = (ans * 10 + s[i] - '0');
cout<<mp[ans]<<"\n";
}
return 0;
}
B
学长也没讲,看着有点难,日后再补。
#include<bits/stdc++.h>
using namespace std;
#define rep(i, j, n) for(int i=j;i<n;i++)
#define per(i, j, n) for(int i=n;i>j;--i)
const int MAXN = (int)1e5+ 5;
const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-8;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
map<int, int> mp;
pii dat[MAXN];
int u[MAXN], d[MAXN], ip[MAXN];
int main() {
int k, q;
while(scanf("%d%d", &k, &q) != EOF) {
memset(u, 0x00, sizeof(u));
memset(d, 0x00, sizeof(d));
for(int i = 1; i <= k; ++i) {
scanf("%d", &dat[i].first);
}
for(int i = 1; i <= k; ++i) {
scanf("%d", &dat[i].second);
}
sort(dat + 1, dat + k + 1);
for(int i = 2; i <= k; ++i) {
u[i] += u[i - 1];
d[i] += d[i - 1];
if(dat[i].second < dat[i - 1].second) ++u[i];
if(dat[i].second > dat[i - 1].second) ++d[i];
}
for(int i = 1; i <= k; ++i) ip[i] = dat[i].first;
u[k + 1] = u[k];
d[k + 1] = d[k];
for(int i = 0; i < q; ++i) {
int l, r;
scanf("%d%d", &l, &r);
int ll = lower_bound(ip + 1, ip + 1 + k, l) - ip;
int rr = upper_bound(ip + 1, ip + 1 + k, r) - ip - 1;
puts(rr <= ll || u[rr] == u[ll] || d[rr] == d[ll] ? "Possible" : "Impossible");
}
}
return 0;
}
C 水题
D
9!=7!*3!*3!*2!
8=7*2*2*2
6=5*3
4=3*2*2
用一个vector,对输入的字符串分解,存放后排序输出就好
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
#define pb push_back
int main() {
int T, n, x;
cin >> T;
while(T--) {
vector<int> v,vv;
string s;
cin >> n;
cin >> s;
for(int i = 0; i < n; ++i) {
x = s[i]-'0';
if(x == 9) {
v.pb(7); v.pb(3); v.pb(3); v.pb(2);
}
else if(x == 8) {
v.pb(7); v.pb(2); v.pb(2); v.pb(2);
}
else if(x == 6) {
v.pb(5); v.pb(3);
}
else if(x == 4) {
v.pb(3); v.pb(2); v.pb(2);
}
else if(x!=1&&x!=0)
v.pb(x);
}
sort(v.begin(), v.end(), greater<int>());
for(int i = 0; i < v.size(); ++i) {
cout << v[i];
}
cout << "\n";
}
return 0;
}
sort(v.begin(), v.end(), greater<int>()); 从大到小排列 输出
E 水题
扫描二维码关注公众号,回复:
2540087 查看本文章
![](/qrcode.jpg)
F
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5+10;
int n,m;
int x[MAXN];
int px[MAXN],uu,vv;
int ans[MAXN];
int s1[MAXN],s2[MAXN],tt=1;
int main(){
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
cin >> T;
while(T--) {
memset(px, 0, sizeof px);
memset(ans, 0, sizeof ans);
memset(s2, 0, sizeof s2);
memset(s1, 0, sizeof s1);
scanf("%d%d",&n,&m);
int a,b,c,i,j,k;
for(a=1;a<=n;a++)
scanf("%d",&x[a]);
s2[0]=19260817;
for(a=1;a<=m;a++) {
scanf("%d%d",&i,&j);
while(j>=s2[tt-1]) tt--;
s2[tt]=j;s1[tt]=i;tt++;
}
k=s2[1];
for(a=1+k;a<=n;a++)
ans[a]=x[a];
for(a=1;a<=k;a++)
px[a]=x[a];
sort(px+1,px+k+1);
uu=1;vv=k;
s2[tt]=0;
for(a=1;a<tt;a++) {
if(s1[a]==1) {
for(b=s2[a];b>s2[a+1];b--)
ans[b]=px[vv--];
}
else {
for(b=s2[a];b>s2[a+1];b--)
ans[b]=px[uu++];
}
}
for(a=1;a<n;a++)
printf("%d ",ans[a]);
printf("%d\n",ans[n]);
}
return 0;
}
难 日后再补
G 水题
H
H
#include<cstdio>
const int N=1e7+10;
const int mod=1e9+7;
int s[N];
void solve()
{
s[1]=1;
for(int i=2;i<=N;i++)
{
if(i%2) s[i]=s[i-1];
else
s[i]=(s[i-1]+s[i/2])%mod;
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
solve();
while(~scanf("%d",&n))
printf("%d\n",s[n]);
return 0;
}
找规律
I 难复杂不谈
J
N 级的台阶,你一开始在底部,每次可以向上迈最多K 级台阶(最少1 级),问到达第N 级
台阶有多少种不同方式。
输入
多组输入,两个正整数N(N ≤ 1000),K(K ≤ 100)。
输出
一个正整数,为不同方式数,由于答案可能很大,你需要输出ans mod 100003 后的结果。
#include<cstdio>
#include<cstring>
int a[1000+10];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k)){
memset(a,0,sizeof(a));
a[0]=1;
for(int i=1;i<=1000;i++){
for(int j=1;j<=k&&(i-j)>=0;j++){
a[i]+=a[i-j];
a[i]%=100003;
}
}
printf("%d\n",a[n]);
}
return 0;
}
K 学着去用栈和队列,stl: map,vector ,set,pair