A - Find Multiple
-
题目大意
-
思路
-
Code
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main()
{
cin>>a>>b>>c;
int fl=0;
for(int i=a;i<=b;i++)
{
if(i%c==0)
{
printf("%d\n",i);
fl=1;
break;
}
}
if(fl==0) cout<<-1<<endl;
return 0;
}
B - Base K
-
题目大意
-
思路
-
Code
#include<bits/stdc++.h>
using namespace std;
long long k;
string a,b;
int main()
{
cin>>k>>a>>b;
//cout<<k<<endl<<a<<endl<<b<<endl;
long long c=0,d=0;
for(int i=0;i<a.length();i++)
{
c=c*k+a[i]-'0';
}
for(int j=0;j<b.length();j++)
{
d=d*k+b[j]-'0';
}
cout<<c*d<<endl;
return 0;
}
C - Long Sequence
-
题目大意
-
思路
-
Code
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
long long n,a[N];
long long x,s=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
s+=a[i];
}
cin>>x;
long long ans=(x/s)*n;
x%=s;
int i=1;
while(x>=0){
x-=a[i++];
ans++;
}
cout<<ans<<endl;
return 0;
}
D - FG operation
- 题目大意
给定一个长度为n的序列,序列中每一个数字都为0-9,,现在有两种操作:F:最左端的两个数x,y - > (x+y)%10;G:最左端的两个数x,y - > (x*y)%10;问:最后还剩一个数的时候,这个数为0-9的方案分别有多少种(MOD998244353)。 - 思路
DP:这个状态好想,但是初始化要注意。 - Code
#include<bits/stdc++.h>
using namespace std;
const int N = 100010, MOD = 998244353;
int n,a[N],f[N][11];
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
f[1][a[1]]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<=9;j++)
{
for(int k=0;k<=9;k++)
{
if((k+a[i])%10==j) f[i][j]=(f[i][j]+f[i-1][k])%MOD;
if((k*a[i])%10==j) f[i][j]=(f[i][j]+f[i-1][k])%MOD;
}
}
long long ans=0;
for(int i=0;i<=9;i++) cout<<f[n][i]<<endl;
return 0;
}
E - Distance on Large Perfect Binary Tree
-
题目大意
给定一颗n层的满二叉树,求它上面路径长度为d的路径条数。 -
思路
挺有意思的题:慢慢描述一下:
每个节点到别的节点路径长度为d的路径由向左x和向右走d-x步组成;
向左向右走路径长度为x:为向下走x层的节点数;
这是假设在满二叉树为无限大的情况下,实际 ,树的深度有限,统计的时候只要向下取一个max(0,x)就好了。
虽然思路和代码简单,但是是好题,要想好久的。 -
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
const int N = 2e6 + 10;
ll a[N];
int n, d;
int main()
{
cin >> n >> d;
ll p = 1;
for(int i = 0; i <= n; i++)
{
a[i] = p;
p = p * 2 % mod;
}
ll ans = a[d] * (a[max(n - d, 0)] - 1) % mod;
for(int i = 1; i < d; i++)
{
if(i < n && d - i < n)
ans = ans + a[i - 1] * a[d - i - 1] % mod * (a[n - max(i, d - i)] - 1) % mod;
}
cout << ans * 2 % mod << endl;
return 0;
}
F - Distance Sums 2
- 题目大意
求一棵树上每个节点到其他节点的距离和。 - 思路
首先,求出每颗子树的size - > f[u];
然后,求出父亲节点到所有节点的距离,当然节点1(根节点)在第一遍dfs时先可以求出 - > ans[u]。
最后,第二次dfs:ans[u] = father到他这边子树的距离 - 一条他与father相连的边带来的权值 + father到另一边子树的距离 + 与father相连的这条边带来的权值 = ans[fa[u]] - f[u] + n - f[u] - Code
#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
typedef long long ll;
ll f[N]; //f[u]表示以u为根的树的size
ll ans[N]; //ans[u]表示节点u到其他节点的距离和
vector<ll> v[N];
int cnt=0;
ll n;
void dfs(int u,int p,int k)
{
for(auto i : v[u])
{
if(i!=p)
{
ans[1]+=k;
dfs(i,u,k+1);
f[u]+=f[i];
}
}
f[u]++;
}
void dfs2(int u,int p)
{
for(auto i : v[u])
{
if(i!=p)
{
ans[i]+=ans[u]-2*f[i]+n;
dfs2(i,u);
}
}
}
int main()
{
scanf("%lld",&n);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);v[y].push_back(x);
}
dfs(1,-1,1);
dfs2(1,-1);
for(int i=1;i<=n;i++)
{
printf("%lld\n",ans[i]);
}
return 0;
}