1.怪兽大逃杀(最大公因数)
输入样例:
【样例1】
3
2 6 6
【样例2】
15
546 3192 1932 630 2100 4116 3906 3234 1302 1806 3528 3780 252 1008 588
输出样例:
【样例1】
2
【样例2】
42
题目描述:
如样例所示,给出一串数字,找出其中的最大值A和最小值a,将A=A-a,重复以上操作,直到数列中所有的数都相等。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[100000];
int main()
{
int n;
cin >>n;
int x;
cin >>x;
int sum=x;
for(int i=1; i<n; i++)
{
cin >>x;
sum=__gcd(sum,x);
}
cout <<sum<<endl;
return 0;
}
2.
题目描述:
给定三个正整数 A、B 和 C。计算以下值模 998244353:
约束
1≤A,B,C≤10^9
测试样例:
输入:
【样例1】
1 2 3
【样例2】
1000000000 987654321 123456789
输出:
【样例1】
18
【样例2】
951633476
代码如下:
#include<bits/stdc++.h>
using namespace std;
const long long M=998244353;
int main()
{
long long a,b,c;
cin>>a>>b>>c;
long long n1=(a+1)*a/2%M;
long long n2=(b+1)*b/2%M;
long long n3=(c+1)*c/2%M;
long long n4=n1*n2%M;
long long n5=n3*n4%M;
cout<<n5<<endl;
return 0;
}
3.问题 D: Quadruple
输入样例1:
2 1
输出样例1:
4
输入样例2:
2525 -425
输出样例2:
10314607400
题目描述:
给定整数 N 和 K。有多少个整数 (a,b,c,d) 满足以下两个条件?
1≤a,b,c,d≤N
a+b−c−d=K
约束条件
1≤N≤10e5
−2(N−1)≤K≤2(N−1)
输入中的所有数字都是整数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,k,a,b,arr[200010]={0};
long long sum=0;
scanf("%lld %lld",&n,&k);
long long mid=n+1;
for(long long i=2;i<=2*n;i++)
{
if(i<=mid)
{
if(i%2==0)
{
b=(i/2-1)*2+1;
arr[i]=b;
}
else
{
b=i/2*2;
arr[i]=b;
}
}
else
{
arr[i]=arr[2*mid-i];
}
}
for(long long i=2;i<=2*n;i++)
{
if(i-k>=2&&i-k<=2*n)
{
sum=sum+arr[i]*arr[i-k];
}
}
printf("%lld\n",sum);
return 0;
}
4.中石油–1106
题目描述:
如图所示,将679以上图这种方式变成6(一位数)需要5次,题目要求输入一个数据,输出次数。
代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char arr[10];
while(scanf("%s",arr)!=EOF)
{
int flag=1,count=0;
while(flag==1)
{
long long len=strlen(arr),sum=1;
if(len==1||len==0)//等于零的情况不要忽略
flag=0;
for(int i=0;i<len;i++)
{
sum=(arr[i]-'0')*sum;
}
memset(arr,'\0',sizeof(arr));//数组初始化
if(flag==1)
{
count++;
for(int i=0;sum>0;i++)//将新得到的数变成字符数组
{
arr[i]=(sum%10)+'0';
sum=sum/10;
}
}
}
printf("%d\n",count);
}
return 0;
}
5.Min-Max 的乘积
题目描述:
给定一个由 N 个整数组成的序列 A。A 有 2^N -1 个非空子序列 B。求所有子序列的 max(B)×min(B) 之和。由于答案可能很大,因此答案取模 998244353。
测试样例:
输入:
【样例1】
3
2 4 3
【样例2】
1
10
【样例3】
7
853983 14095 543053 143209 4324 524361 45154
输出:
【样例1】
63
【样例2】
100
【样例3】
206521341
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const long long N = 2e5 + 3,mod= 998244353;
long long arr[N];
int main()
{
int n;
scanf("%d",&n);
long long sum = 0;
for (int i = 1; i <= n; i++)
{
scanf("%lld", &arr[i]);
sum += arr[i] * arr[i] % mod;
}
sort(arr + 1, arr + 1 + n);
int t = 0;
for (int i = 1; i <= n; i++)
{
sum =(sum+ arr[i] * t )% mod;
t= (t * 2 + arr[i]) % mod;
}
printf("%lld\n", sum);
return 0;
}
解题思路:
6.交换数
测试样例:
输入:
5
2 3 1 5 4
输出:
3
代码如下:
#include<iostream>
using namespace std;
int arr[10010];
int n;
int cnt;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>arr[i];
int i=1;
while(1)
{
if(arr[i]!=i)
{
cnt++;
int t=arr[i];
arr[i]=arr[t];
arr[t]=t;
}
if(i==n) break;
else if(arr[i]!=i) continue;
else i++;
}
cout<<cnt<<endl;
return 0;
}
7. 小凯的疑惑
#include<iostream>
using namespace std;
int main()
{
long long a,b;
scanf("%lld %lld",&a,&b);
printf("%lld",a*b-a-b);
return 0;
}
8.蚂蚁感冒
长 100 厘米的细长直杆子上有 n 只蚂蚁。它们的头有的朝左,有的朝右。每只蚂蚁都只能沿着杆子向前爬,速度是 1 厘米/秒。当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。这些蚂蚁中,有 1 只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
输入格式
第一行输入一个整数 n, 表示蚂蚁的总数。接着的一行是 n 个用空格分开的整数 Xi, Xi 的绝对值表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现 0 值,也不会出现两只蚂蚁占用同一位置。
其中,第一个数据代表的蚂蚁感冒了。
输出格式
输出1个整数,表示最后感冒蚂蚁的数目。
数据范围
1<n<50,
0<|Xi|<100
输入样例1:
3
5 -2 8
输出样例1:
1
输入样例2:
5
-10 8 -20 12 25
输出样例2:
3
#include<iostream>
#include<algorithm>
using namespace std;
int a[51],p[51];
bool cmp(int x,int y)
{
return abs(x)<abs(y);
}
int main()
{
int n,k;
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
int aa=a[0];
sort(a,a+n,cmp);//按其绝对值排序
for(int i=0;i<n;i++)
{
if(aa==a[i]) k=i;
if(a[i]>0) p[i]=1;//转0,1比较方便理解
else p[i]=0;
}
if(aa>0)
{
int res=1;
for(int i=k+1;i<n;i++)
{
if(p[i]==0) res++;
}
if(res>1)//若存在右0,才会感染左1
{
for(int i=0;i<k;i++)
{
if(p[i]==1) res++;
}
}
cout<<res<<endl;
return 0;
}
else
{
int res=1;
for(int i=0;i<k;i++)
{
if(p[i]==1) res++;
}
if(res>1)//若存在左1,才会感染右0
{
for(int i=k+1;i<n;i++)
{
if(p[i]==0) res++;
}
}
cout<<res<<endl;
return 0;
}
}
9. 约瑟夫问题
输入:
6 2
12 4
8 3
0 0
输出:
5
1
7
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int arr[310];
int main()
{
while(cin>>n>>m,n||m)
{
memset(arr,0,sizeof arr);
int k=1;
for(int i=1; i<n; i++)
{
int cnt=0;
//int k=1;
while(cnt<m)
{
if(k==n+1) k=1;
if(arr[k++]==0) cnt++;
}
arr[k-1]=1;
}
for(int i=1;i<=n;i++)
{
if(arr[i]==0) cout<<i<<endl;
}
}
return 0;
}