1. 程式人生 > 實用技巧 >CSP-S 2020模擬訓練題1-信友隊T1 四平方和

CSP-S 2020模擬訓練題1-信友隊T1 四平方和

題意簡述

\(n\)是正整數,其四個最小的因子分別為\(d_1,d_2,d_3,d_4\)

求對於所有的\(n \le m\)滿足

\[d_1^2+d_2^2+d_3^2+d_4^2=n \]

\(n\)的個數。

分析

這是一道數競題,下面來求\(n\)

顯然\(d_1=1\),則\(n=1+d_2^2+d_3^2+d_4^2\)

\(n\)是奇數,則其因子都是奇數,其平方和為四個奇數相加為偶數,矛盾。故n為偶數\(d_2=2\),則\(n-5=d_3^2+d_4^2\)

此時,\(d_3\)只可能是\(3,4\)或者大於\(4\)質數

  • \(d_3=3\),則\(d_4=4\)
    \(d_4=6\),驗算得不存在這樣的\(n\)
  • \(d_3=4\),則由奇偶性可得,\(d_4\)一定為奇數,所以\(d_4^2 \equiv 1(\mbox{mod } 4)\),但\(n-5-d_3^2=n-21 \equiv 3(\mbox{mod }4)\),所以矛盾。

所以\(n\)只能是一個大於\(4\)的質數,且\(d_4=2d_3\),故\(n-5=5d_3^2 \Longrightarrow n=5(d_3^2+1)\)。故\(5 \nmid n\),即\(d_3=5,d_4=10\),得\(n=130\)。故\(\forall n \in \mathbb{N^+}\)只有\(n=130\)

符合題意。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<vector>
#define IL inline
#define re register
#define LL long long
#define ULL unsigned long long
#define re register
#define debug printf("Now is %d\n",__LINE__);
using namespace std;

template<class T>inline void read(T&x)
{
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    x=ch-'0';ch=getchar();
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
}
inline LL read()
{
	int x=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    x=ch-'0';ch=getchar();
    while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
    return x;
}
int G[55];
template<class T>inline void write(T x)
{
    int g=0;
    if(x<0) x=-x,putchar('-');
    do{G[++g]=x%10;x/=10;}while(x);
    for(re int i=g;i>=1;--i)putchar('0'+G[i]);putchar('\n');
}
LL n;
int main()
{
	n=read();
	if(n>=130) cout<<1<<endl;
	else cout<<0<<endl;
	return 0;
}