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;
}