中文题面,比上一次简单一点;
https://www.jisuanke.com/contest/5870
A、B、C很简单,D、E还行,F较难;
A:
斐波那契数列,输出f[n * 2]即可;
B:
鸡兔同笼问题,考察输入输出……
注意除数可能为0的情况(数据里面没有);
C:
高精度加法。
D:
cin超时,scanf 49ms?
注意%后为0的情况需要特判。
模拟就是了;
E:
n只有24,可以打表,注意n = 24时,7111,1可以,可能会忽略这种情况;
F:
只能O(n);
可以观察到Cn = a0 * bn + a1 + bn-1 ……;
对于第n项,a和b的下标相加为n;
Cl + …… + Cr = a0 * (bl + …… +br) + a1 * (bl-1 + …… +br-1) + a2 * (bl-2 + …… + br-2) …… + ar * b0;
先求出b在l到r的和,然后l和r不断左移即可;
%和 * /的优先级相同;
在取%运算中涉及减法,注意加上mod防止结果为负数;
代码:
D:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll T,n,pos;
ll a[10001],num[10001],b[10001];
void solve(){
cin >> T;
b[1] = a[1] = 9;
for(ll i = 2;i <= 15;i ++)
a[i] = a[i - 1] * 10,b[i] = a[i] + b[i - 1];
for(ll i = 1;i <= 15;i ++)
num[i] = i * a[i] + num[i - 1];
while(T --){
scanf("%lld",&n);
for(ll i = 1;i <= 15;i ++)
if(num[i] >= n){
pos = i;
break;
}
ll di = n - num[pos - 1],ji = n - num[pos - 1],shu,wei;
di %= pos;
ji /= pos;
if(di) ji ++;
shu = b[pos - 1] + ji;
if(di == 0) printf("%d\n",(int)(shu % 10));
else{
wei = pos - di;
while(wei)
shu /= 10,wei --;
printf("%d\n",(int)(shu % 10));
}
}
return;
}
int main(){
solve();
return 0;
}
E:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[99] = {0,0,0,0,0,0,0,0,0,0,1,0,2,0,4,0,10,2,17,4,39,15,65,42,139};
int T,n;
void solve(){
cin >> T;
while(T --){
cin >> n;
cout << a[n] << endl;
}
return;
}
int main(){
solve();
return 0;
}
F:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 5e5 + 110;
const ll mod = 1e9 + 7;
ll a[MAXN],b[MAXN];
ll n,m,l,r,T;
void solve(){
ll ans = 0,sum = 0;
scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
for(int i = 0;i <= n;i ++) scanf("%lld",&a[i]);
for(int i = 0;i <= m;i ++) scanf("%lld",&b[i]);
for(int i = l;i <= m && i <= r;i ++) sum = (sum + b[i]) % mod;
for(int i = 0;i <= n;i ++){
ans = (ans + sum % mod * a[i]) % mod;
l --;
if(l >= 0 && l <= m) sum = (sum + b[l]) % mod;
if(r >= 0 && r <= m) sum = (sum - b[r] + mod) % mod;
r --;
}
printf("%lld\n",ans);
return;
}
int main(){
cin >> T;
while(T --)
solve();
return 0;
}