好几天没好好学习了(咸鱼晒干了)
把稍微没那么咸鱼的几天前的一场牛客网的比赛稍微看了一下,菜的要死,这一场大数的比较多,都死了。
A.找一找
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数
输入描述:
第一行输入一个n
接下来一行输入n个正整数ai
输出描述:
输出符合条件个数
示例1
输入
5 1 2 3 4 5
输出
2
说明
5个数中1和2符合条件,1是后面每个数的因子
这道题如果两个直接比较数组里的数for,会超时,因为数组里可能有相同的数,所以数据处理一下,直接比较一次将数的个数加起来就可以,遍历数据范围那么大小就可以了,暴力。
代码:
1 //A-这个题将数据压缩一下,可以减少循环次数 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 const int maxn=1e6+10; 10 const int maxm=1e6; 11 int num[maxn]; 12 int main(){ 13 int n; 14 while(~scanf("%d",&n)){ 15 for(int i=0;i<n;i++){ 16 int x; 17 scanf("%d",&x); 18 num[x]++; 19 } 20 int ans=0; 21 for(int i=1;i<=maxm;i++){ 22 if(num[i]){ 23 for(int j=i*2;j<=maxm;j+=i){ 24 if(num[j]){ 25 ans+=num[i];break; 26 } 27 } 28 } 29 } 30 printf("%d\n",ans); 31 } 32 return 0; 33 }
C.列一列
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An。尽管他计算非常精准,但很快他就弄混了自己的草稿纸,他找出了一些他计算的结果,但他忘记了这些都是数列中的第几项。
输入描述:
每行包括数列中的一项Ak(k<=100000)。
总行数T<=30。
输出描述:
对于每一项Ak,输出一行包括一个正整数k表示输入中数是数列的第几项。
示例1
输入
2 3 5 8 13
输出
2 3 4 5 6
这个题真的是大数了,递推到后面的数就很大了,就超过int的范围了。
我感觉输入的时候要按字符数组输入(试了一下直接输大数ull的不行)
代码,直接unsigned long long的可以,取模的也可以。取模的话有可能模厚的数相同,所以在判断的数上处理一下,因为只有很大的数才会取模之后发生变化,直接判断输入的字符串的长度就可以。
因为感觉sscanf函数有点意思,所以才想写题解。。。
这个题用java写大数也可以,但是我没写(;′д`)ゞ
代码1:
1 //C-ull版 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<map> 10 using namespace std; 11 typedef unsigned long long ull; 12 const int maxn=1e5; 13 ull a[maxn]; 14 void fun(){ 15 a[0]=0;a[1]=1;a[2]=2; 16 for(int i=3;i<=maxn;i++) 17 a[i]=a[i-1]+a[i-2]; 18 } 19 char s[maxn]; 20 int main(){ 21 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 fun(); 23 while(cin>>s){ 24 int len=strlen(s); 25 ull n=0; 26 for(int i=0;i<len;i++) 27 n=n*10+s[i]-‘0‘; 28 for(int i=1;i<=maxn;i++){ 29 if(a[i]==n){ 30 cout<<i<<endl; 31 break; 32 } 33 } 34 } 35 return 0; 36 } 37 */
代码2:
1 //C-取模版 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 using namespace std; 9 const int mod=1e9; 10 const int maxn=1e5+10; 11 int a[maxn]; 12 void fun(){ 13 a[1]=1;a[2]=2; 14 for(int i=3;i<=maxn;i++) 15 a[i]=(a[i-1]+a[i-2])%mod; 16 } 17 char s[maxn]; 18 int main(){ 19 int n; 20 fun(); 21 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 22 while(cin>>s){ 23 int len=strlen(s); 24 if(len<10)sscanf(s,"%d",&n); 25 else sscanf(s+(len-9),"%d",&n); 26 for(int i=1;i<=maxn;i++){ 27 if(a[i]==n){ 28 cout<<i<<endl; 29 break; 30 } 31 } 32 } 33 return 0; 34 }
sscanf是个好东西。
溜了。