前缀和快数幂
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sc(a) scanf("%d",&a)
#define pf printf
const int N=2e5+10;
ll mod=1e9+7;
ll n,t;
ll a[N],b[N];
ll s[N];
ll sum[N];
ll ss[N];
ll p[N];
ll ny(ll x)
{
ll ans=1,n=mod-2;
x%=mod;
while(n)
{
if(n%2==1)
ans*=x,ans%=mod;
x*=x;
x%=mod;
n/=2;
}
return ans;
}
int main()
{
cin>>t;
p[1]=1;
for(int i=2;i<=N-10;i++)
{
p[i]=p[i-1]*i;
p[i]%=mod;
}
b[1]=1;
for(int i=2;i<=N-10;i++)
b[i]=b[mod%i]*(mod-mod/i)%mod;
while(t--)
{
scanf("%lld",&n);
s[0]=0;
sum[0]=0;
ss[n+1]=0;
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
s[i]=a[i]+s[i-1];
s[i]%=mod;
sum[i]=sum[i-1]+i*a[i]%mod;
sum[i]%=mod;
}
for(int i=n;i>=1;i--)
{
ss[i]=ss[i+1]+a[i]*(n-i+1)%mod;
ss[i]%=mod;
}
ll ans=0;ll m=0;
for(int i=1;i<=ceil(n*1.0/2);i++)
{
//ans+
m=(s[n-i+1]-s[i-1])*i;
//ans%=mod;
m+=sum[i-1]+ss[n-i+2];
m%=mod;
m*=p[n];
m%=mod;
m*=b[i];
m%=mod;
ans+=m;
ans%=mod;
}
for(int i=ceil(n*1.0/2)+1;i<=n;i++)
{
m=(s[i]-s[n-i])*(n-i+1);
m%=mod;
m+=sum[n-i]+ss[i+1];
m%=mod;
m*=p[n];
m%=mod;
m*=b[i];
m%=mod;
ans+=m;
ans%=mod;
}
ll k=n*(n+1);
k%=mod;
k*=b[2];
k%=mod;
k*=p[n];
k%=mod;
ans*=ny(k);
ans%=mod;
cout<<ans<<'\n';
}
return 0;
}
模拟
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sc(a) scanf("%d",&a)
#define pf printf
const int N=1e6+10;
int n;
char a[100];
int s[N];
int main()
{
while(~scanf("%s",a+1))
{
n=strlen(a+1);
int mx=0;
for(int i=1;i<=n;i++)
{
if(a[i]>='0'&&a[i]<='9'){
mx=max(mx,a[i]-'0');
s[i]=a[i]-'0';
}
else if(a[i]>='A'&&a[i]<='F'){
int x=a[i]-'A'+10;
mx=max(mx,x);
s[i]=x;
}
}
int f=0,k;char op;
for(int j=1;j<=n;j++)
{
if((a[j]>='0'&&a[j]<='9')||(a[j]>='A'&&a[j]<='F'));
else {
k=j;op=a[j];break;
}
}
int kk;
for(int j=k+1;j<=n;j++)
{
if((a[j]>='0'&&a[j]<='9')||(a[j]>='A'&&a[j]<='F'));
else {
kk=j;break;
}
}
for(int i=max(mx+1,2);i<=16;i++)
{
ll x=0,y=0,z=0;
ll d=1;
for(int j=k-1;j>=1;j--)
{
x+=s[j]*d;
d*=i;
}
d=1;
for(int j=kk-1;j>=k+1;j--)
{
y+=s[j]*d;
d*=i;
}
d=1;
for(int j=n;j>=kk+1;j--)
{
z+=s[j]*d;
d*=i;
}
if(op=='+'){
if(x+y==z){
f=i;
break;
}
}
else if(op=='-'){
if(x-y==z){
f=i;
break;
}
}
else if(op=='*'){
if(x==0){
if(z==0){
f=i;break;
}
else continue;
}
if(z/x==y&&z%x==0){
f=i;break;
}
}
else {
if(x%y==0&&x/y==z){
f=i;break;
}
}
}
if(f==0)f=-1;
pf("%d\n",f);
}
return 0;
}
1009.Divisibility
签到
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int mod=998244353;
const int maxn=5e5+10;
ll s;
int main()
{
int t;
ll b,x;
cin>>t;
while(t--)
{
scanf("%lld %lld",&b,&x);
if(x>=b)
printf("F\n");
else if((b+x-1)%x==0)
printf("T\n");
else
printf("F\n");
}
return 0;
}

355

被折叠的 条评论
为什么被折叠?



