B Chaya Calendar
对于i位置,找到第一个大于当前年份的i的倍数年份。
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
void solve()
{
int n;
cin >> n;
vector<long long int> a(n + 1);
for(int i = 1;i <= n;i ++)
{
cin >> a[i];
}
long long int now = a[1];
for(int i = 2;i <= n;i ++)
{
long long int x = ceil(now * 1.0 / a[i]); //已经是几倍;向上取整
if(x * a[i] <= now)
{
x ++;
}
now = x * a[i]; //
}
cout << now << endl;
}
int main()
{
int t;
cin>>t;
while(t--)
{
solve();
}
}
C
很容易发现,如果记录相乘的数__int128都是没法存下来的,如果求逆元进行计算的话,模数不是质数也不好求,但是我们发现数组删除的顺序我们是知道的,所有我们可以将其进行逆运算,也就是改成每次向数组中添加一个元素,求其乘积对模数的模,这样就比较简单了。
正序模拟会爆,我们可以考虑逆推,先通过字符串确定好最后一个留在数组中的数,然后倒退,边乘边取模,最后逆向输出答案即可。
#include<iostream>
#include<cstring>
using namespace std;
int a[200010],ans[200010],j[200010];
char s[200010];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
memset(a,0,sizeof a);
for(int i=1;i<=n;i++) cin>>a[i];
memset(s,0,sizeof s);
scanf("%s",s);
int l=1,r=n;
int k=1;
memset(j,0,sizeof j);
for(int i=0;i<n;i++)
{
if(s[i]=='L')
{
j[k]=a[l++];
++k;
}
else
{
j[k]=a[r--];
++k; //多加
}
}
int cheng=1;
memset(ans,0,sizeof ans);
k--; //
//for(int i=k;i>=1;i--)
for(int i=n;i>=1;i--)
{
cheng=cheng*j[i]%m;
ans[i]=cheng;
}
for(int i=1;i<=n;i++)
{
printf("%d ",ans[i]);
}
cout<<endl;
}
}