2024 暑假友谊赛-热身2 (7.12)zhaosang

E-E

https://vjudge.net/problem/AtCoder-diverta2019_b
给你 a, b, c ,n就是问你有多少(ia+jb+k*c)等于n的答案i,j,k任意几个都可以为零
两种思想,数据量比较小,那么可以三重循环+减枝,或者枚举两个变量算出第三个
代码如下:
第一种三重循环

#include <bits/stdc++.h>

using namespace std;
using ll =long long;
ll v[10000010];
ll A,B,C,n;
ll ans;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>A>>B>>C>>n;
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n/B;j++){
			for(int k=0;k<=n/C;k++){
				if(A*i+B*j+C*k==n){
					ans++;
				}else if(A*i+B*j+C*k>=n){
					break;
				}
			}
		}
	}
	cout<<ans;
}
第二种 两重循环算第三个
#include <bits/stdc++.h>

using namespace std;
using ll =long long;
ll v[10000010];
ll A,B,C,n;
ll ans;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>A>>B>>C>>n;
	for(int i=0;i*A<=n;i++){
		for(int j=0;j*B+A*i<=n;j++){
			int p=n-i*A-j*B;
			if(p%C==0)ans++;
			}
		}
	cout<<ans;
}
D-D

https://vjudge.net/contest/640017#problem/D
D和E差不多,这个是输出一个满足条件的就可以
我们遍历两重循环,算出满足条件的第三个值就行
代码如下:

#include <bits/stdc++.h>

using namespace std;
using ll =long long;
ll v[10000010];
ll l,n,m;

int main() {
	ll N;
	cin >> N;
	
	for (ll h = 1; h <= 3500; ++h) {
		for (ll n = 1; n <= 3500; ++n) {
			long long numerator = 4LL * h * n - N * (h + n);
			long long denominator = N * h * n;
			if (numerator > 0 && denominator % numerator == 0) {
				ll w = static_cast<ll>(denominator / numerator);
				if (w > 0) {
					cout << h << " " << n << " " << w << std::endl;
					return 0;
				}
			}
		}
	}
	
	return 0;
}


F-F

https://vjudge.net/contest/640017#problem/F

给你一定数量的子串,问你能构成的有AB的子串的最多数量
模拟题,找到A为末尾为a,B为开头的数量为b,还需要判断既有上面两种都有的情况,
然后计算出最多数量为a,bl里面小那个,还需要特判一下a等于b等于c情况

代码如下

#include <bits/stdc++.h>

using namespace std;
using ll =long long;
ll l,n,m;
vector<string>v(100000);
vector<ll>vt(1000000);
string s3;
ll a=0,b=0,c=0;
int fun2(const std::string& str, const std::string& sub){
	int num = 0;
	ll len = sub.length();
	if (len == 0)len=1;//应付空子串调用
	for (ll i=0; (i=str.find(sub,i)) != std::string::npos; num++, i+=len);
	return num;
}

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>v[i];
		if(v[i][0]=='B'){
			b++;
		}
		if(v[i][v[i].length()-1]=='A'){
			a++;
		}
		if(v[i][v[i].length()-1]=='A'&&v[i][0]=='B'){
			c++;
		}
	}
	if(a==b&&b==c){
		if(c!=0){
			a=c-1;
			b=c-1;
		}
	
	}
	
	ll ans=0;
	for(int i=1;i<=n;i++){
		ans+= fun2(v[i],"AB");
	}
	cout<<ans+min(a,b);
	
	
}
G-G

https://vjudge.net/contest/640017#problem/G

这道题就是求一个数有多少个满足x/m=x%m的数m,求他们的和
被除数/除数=商+余数 , 有 n=mx+x; m =n/x-1,枚举余数,
除数大于等于余数,m>x,所以 n =m
(x-1)>x*(x-1)枚举余数即可

代码如下

#include <bits/stdc++.h>

using namespace std;
using ll =long long;
ll v[10000010];
ll A,B,C,n;
ll ans;
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(ll x=1;x*(x+1)<n;x++){
		if(n%x==0)ans+=(n/x-1);
	}
	cout<<ans;
}

A-A

https://vjudge.net/contest/640017#problem/A

求期望概率
思路公式最后推出来是 E(N)=E(N-1)+pn次方
所以需要快速幂,答案就是推出公式然后算出来
代码如下

#include <bits/stdc++.h>

#define int long long
const int mod = 998244353;

int qmi(int a, int b)
{
	a %= mod;
	int res = 1;
	while (b)
	{
		if (b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res;
}

void solved ()
{
	int n;
	std::cin >> n;
	std::vector<int> a(n + 1), dp(n + 7);
	
	for (int i = 1; i <= n; i++)
	{
		std::cin >> a[i];
		a[i] = qmi(a[i], mod - 2);
		
	}
	
	for (int i = 1; i <= n; i++)
	{
		dp[i] = (dp[i - 1] + 1) * 100 % mod * a[i] % mod;
	}
	
	std::cout << dp[n];
}

signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	int t = 1;
	// std::cin >> t;
	while (t--) solved ();
	
	return 0;
}
posted @ 2024-07-14 19:50  冬天的睡袋  阅读(12)  评论(0编辑  收藏  举报