A题 写麻烦了 直接乘 p-1次就可以 我还用快速幂 把1--p-1都求了出来 边求边取模
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
int result(int a,int b,int m)
{
int d,t;
d=1;
t=a;
while (b>0)
{
if (b%2==1)
d=(d*t)%m;
b/=2;
t=(t*t)%m;
}
return d;
}
int main()
{
int i,j,k,n,m,sum=0,flag = 1,s,g;
cin>>n;
for(i = 1; i < n ; i++)
{
flag =1;
for(j = 1 ; j <= n-2 ; j++)
{
s = result(i,j,n);
if((s-1)%n==0)
{
flag = 0;
break;
}
}
if(!flag)
continue;
s = result(i,n-1,n);
if((s-1)%n!=0)
{
flag = 0;
continue;
}
sum++;
}
cout<<sum<<endl;
return 0;
}
B题
#include<cstdio>
#include<iostream>
#include<cstring>
#include<stdlib.h>
using namespace std;
char str[1000010];
int main()
{
int i,j=0,k,n,a=0,f=0;
char c;
cin>>n;
getchar();
for(i = 1; i <= n ; i++)
{
scanf("%c",&c);
if(c=='A')
a++;
else if(c=='F')
f++;
else
if(c=='I')
j++;
}
if(j==1)
cout<<"1"<<endl;
else
if(j==0)
{
cout<<a<<endl;
}
else
cout<<"0\n";
return 0;
}
C题 写挂了刚开始写了一半线段树 看到好多人过 觉得没那么难 就随便写了个 当时过了 之后 WA了 听队长说了简单方法
用一数组不断更新尾部应加的值 若删掉这个数 就把这个数值加到它的前一个 注意删掉之后 都更新为0
#include <iostream>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
using namespace std;
long long sum[1000010],x[1000010];
int main()
{
int i,j,k,n,m,a,b,c,g=1;
x[g] = 0;
long long s=0;
cin>>n;
while(n--)
{
cin>>a;
if(a==1)
{
cin>>b>>c;
sum[b] += c;
s+=(b*c);
printf("%.6lf\n",s*1.0/g);
}
else if(a==2)
{
cin>>b;
g++;
x[g] = b;
s+=b;
printf("%.6lf\n",s*1.0/g);
}
else
{
if(g>=2)
{
s-=(x[g]+sum[g]);
sum[g-1]+=sum[g];
sum[g] = 0;
x[g] = 0;
g--;
printf("%.6lf\n",s*1.0/g);
}
}
}
return 0;
}