01
アートクラス
02
グラフ理論クラス
は、ポイントを1つずつ追加することを検討し、新しく追加されたポイントxが合成数の場合、特定の係数に接続され、全体の重みはxだけ増加します。xが素数の場合、2に接続され、全体の値が増加します。 2倍x これが最適な接続状況です。
Min25ふるいを使用して、n + 1に加えて2 + 3 + 4 + ... n + 1内の素数のプレフィックス合計を見つけます。
#include <cstdio>
#include <cstring>
using namespace std;
const long long Nmax=10000000005ll;
const long long SQR=100005ll;
long long N,Ha,Haa,g[SQR*3],ans;
long long w[SQR*3],id1[SQR],id2[SQR],cnt;
long long f[SQR],P[SQR],SP[SQR],num;
void get_pri(long long Pmax)
{
num=0;
memset(f,0,sizeof(f));
for (long long i=2; i<=Pmax; i++)
{
if (!f[i])
{
P[++num]=i;
SP[num]=SP[num-1]+i;
}
for (long long j=1,k; j<=num && (k=i*P[j])<=Pmax; j++)
{
f[k]=1;
if (i%P[j]==0)
break;
}
}
}
void get_id()
{
cnt=0;
for (long long i=1,k; i<=N; )
{
k=N/i; //g[k] 是需要的,将 k 离散出来
w[++cnt]=k; //离散出的数中第 cnt 个为 k
if (k<=SQR)
id1[k]=cnt;
else
id2[N/k]=cnt;
i=N/k+1; //使 k 跳到往后使 N/k 加 1
}
}
inline int ID(long long x){
return (x<=SQR ? id1[x] : id2[N/x]);}
void get_g()
{
long long X;
for (int i=1; i<=cnt; i++) //dp初始化, 即 j=0 时 g[w][j] 等于2~w累加
{
g[i]=(w[i]+2)*(w[i]-1)/2;
}
for (int j=1; j<=num; j++)
{
for (int i=1; i<=cnt; i++)
{
if (P[j]*P[j]>w[i]) break;
//X=((g[ID(w[i]/P[j])]-SP[j-1])%Ha+Ha)%Ha;
X=g[ID(w[i]/P[j])]-SP[j-1];
g[i]=g[i]-P[j]*X;
//if (g[i]<0) g[i]=(g[i]%Ha+Ha)%Ha;
//if (g[i]>Ha) g[i]%=Ha;
}
}
}
int main()
{
long long T,n;
scanf("%lld",&T);
get_pri(SQR);
while(T--)
{
ans=0;
scanf("%lld%lld",&n,&Ha);
Haa=Ha*Ha;
N=n+1;
get_id();
get_g();
ans=g[ID(N)]%Ha;
ans=(ans+(n+3)%Ha*n%Ha*(Ha+1)/2%Ha)%Ha; //2+3+...+(n+1)
ans=(ans-4+Ha)%Ha;
printf("%lld\n",ans);
}
return 0;
}
/*
1
260136231 19260817
*/
03
チェスクラス
04
チェスクラス
05
昼食
06
CCPCトレーニングクラス
いくつかの例を挙げると、最初に最も多く現れる文字をすべて配置するのが最善の状況であることがわかりました。
#include <cstdio>
int T,a[30],ans;
char ch;
int main()
{
scanf("%d",&T);
ch='a'-5;
for (int kk=1; kk<=T; kk++)
{
for (int i=0; i<26; i++)
a[i]=0;
while (ch<'a' || ch>'z')
ch=getchar();
while (ch>='a' && ch<='z')
{
a[ch-'a']++;
ch=getchar();
}
ans=0;
for (int i=0; i<26; i++)
if (ans<a[i])
ans=a[i];
printf("Case #%d: %d\n",kk,ans);
}
return 0;
}
07
PEクラス
08
数学の授業
09
レポート
10
3x3畳み込み
この行列乗算のイメージポイントは、Kの左上隅をAのポイント(i、j)に座屈させ、重なり合う位置の合計を新しいポイント(i、j)に割り当てます。Kが一部のポイントの位置がAを超える場合は、それらのKの位置を無視します(つまり、乗算できる場合は乗算します)。
サンプルを見ると、答えはそのまま出力されるか、すべて0であると推測できます。
そのまま出力する場合を考えてみましょう。「Kは左上隅にゼロ以外の要素しかありません」と答えた場合のみ、そのまま出力されます。
Kが他の場合の答えは0です:Aの右下隅の点をブレークスルーとして取ります。K要素の合計が1であるため、Kが左上隅以外の場所に非ゼロ要素を持っている場合、Aの右下隅について各乗算の後、それは減少し、0に比例して減少します。このようにして、Aの右下隅の周りの点も減少し続け、A全体が最終的に0になる傾向があります。
問題は解決しました。フォーマット(行末のスペース)に注意してください。
#include <cstdio>
int main()
{
//freopen("1.txt","w",stdout);
int T,n,f,a[1000][1000],b[10];
scanf("%d",&T);
while (T--)
{
f=0;
scanf("%d",&n);
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
scanf("%d",&a[i][j]);
for (int i=1; i<=9; i++)
{
scanf("%d",&b[i]);
f+=b[i];
}
if (b[1]==f && f>0)
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (j==n)
printf("%d",a[i][j]);
else
printf("%d ",a[i][j]);
}
printf("\n");
}
}
else
{
for (int i=1; i<=n; i++)
{
for (int j=1; j<=n; j++)
{
if (j==n)
printf("0");
else
printf("0 ");
}
printf("\n");
}
}
}
return 0;
}
11
Xor
12
残差多項式