Time Limit: 1 Sec Memory Limit: 256 MB
对于每组数据:
输出最多剩下的不同的数的个数
4
1 3 1 2
F(1)=2
F(2)=0
F(3)=4
F(4)=0
题意
题解:
对于每一个数,我们都直接枚举倍数就好了,直接倒着做!
代码:
//qscqesze #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define maxn 200001 #define mod 10007 #define eps 1e-9 int Num; char CH[20]; //const int inf=0x7fffffff; //нчоч╢С const int inf=0x3f3f3f3f; /* inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } */ //************************************************************************************** inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } inline void P(int x) { Num=0;if(!x){putchar(‘0‘);puts("");return;} while(x>0)CH[++Num]=x%10,x/=10; while(Num)putchar(CH[Num--]+48); puts(""); } int a[10010],mp[10010]; int main() { int n; while(scanf("%d",&n)!=EOF) { ll ans=0; for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=10010;i++) mp[i]=n+1; for(int i=n;i;i--) { int mi=n+1; for(int j=a[i];j<10010;j+=a[i]) mi=min(mi,mp[j]); if(mi<=n) ans+=mi; mp[a[i]]=i; } printf("%lld\n",ans); } }
原文:http://www.cnblogs.com/qscqesze/p/4458580.html