地址:点击打开链接
A、找一找
思路:
从尾到头找一遍即可。数据有点大,注意用 long long
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define ll long long
#define inf 0x7f7f7f7f
#define mod 1000000009
#define maxn 1000000
using namespace std;
ll a[maxn +1000];
int main(){
ll n,x;
while (scanf("%lld",&n)!=EOF){
memset(a,0,sizeof(a));
ll maxx=-1;
for(ll i=1;i<=n;i++){
scanf("%lld",&x);
a[x]++;
if (x>maxx)maxx=x;
}
ll ans=0;
for (ll i=1;i<=maxx;i++){
if (a[i]){
for (ll j=i*2; j<=maxx; j+=i){
if (a[j]){
ans+=a[i];
break;
}
}
}
}
printf("%lld\n",ans);
}
return 0;
}
C、列一列
思路:因为数据非常的大,所以关键的一步就是对其取模,然后再进行判断,我这里取得是1e8来进行取模。然后在进行判断。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#define ll long long
#define inf 0x7f7f7f7f
#define maxn 100000+100
#define mod 100000000
using namespace std;
ll f[maxn];
ll solve(ll a,ll b){ //快速幂
if (b==0)
return 1;
ll ans=1;
ll k=a;
while(b){
if(b&1)
ans=ans*k;
k=k*k;
b=b/2;
}
return ans;
}
string s;
int main(){
ll i,j,m,z;
f[1]=1;
f[2]=2;
for (i=3;i<maxn;i++){
f[i]=(f[i-1]+f[i-2])%mod;
}
while (cin>>s){
ll l=s.length();
ll ans=0;
for (i=l-1,j=0;i>=0&&j<8;i--,j++){ //关键理解
ans=ans+(s[i]-'0')*solve(10,j);
}
for (i=1;i<maxn;i++){
if (ans==f[i]){
cout<<i<<endl;
}
}
}
return 0;
}