2 条题解
-
1
dalao 的证明还是太吃操作了 有没有更简单的做法?
我们发现如果区间长度较小 可以$O(len*\sqrt V/log V(判定素数)+len/log V*\sqrt V(判定平方和))$做的
因此分块 块长越小越优 对于整块可以打表 100KB 块长可以开到3e4 然后就过了
#include<bits/stdc++.h> //#define int long long //#define big __int128 #define pii pair<int,int> #define F first #define S second #define mkp make_pair using namespace std; const int N=3e8,E=1e4; int B=sqrt(3e8),Bo=3e4; int L,R; int db[101000]={/*自己打表*/}; int K(int x){ return (x-1)/Bo+1; } const int P=1e5; bitset<P+E>pvis; int pri[P/10+E],ptot; int isp(int x){//质数 for(int i=1;pri[i]<=sqrt(x);i++){ if(x%pri[i]==0) return 0; }return 1; } int iss(int x){//平方数 for(int i=1;i<=sqrt(x);i++){ int y=x-i*i,s=sqrt(y); if(s*s==y) return 1; }return 0; } int gtans(int l,int r){ if(l==1) l++; int ret=0; for(int i=l;i<=r;i++){ if(isp(i)){ ret+=iss(i); } }return ret; } signed main() { for(int i=2;i<=P;i++){ if(pvis[i]==0){ pri[++ptot]=i; } for(int j=1;j<=ptot&&i*pri[j]<=P;j++){ pvis[i*pri[j]]=1; if(i%pri[j]==0) break; } } int ans=0; cin>>L>>R; if(K(L)==K(R)){ ans=gtans(L,R); }else{ ans=db[K(R)-1]-db[K(L)]; ans=ans+gtans(L,K(L)*Bo)+gtans((K(R)-1)*Bo+1,R); } cout<<ans; return 0; } -
0
我的21号染色体还挺多的,要分你点吗
注意到 形如4n+1的素数p都可以被表示为两个正整数的平方相加的形式。
症冥如下:
(下文暂且称形如 的素数为 )
由欧拉判别法知:对于奇素数 和整数 ,总有
$a^{\frac{p-1}{2} } \equiv \left ( \frac{a}{p} \right ) (\mathrm{mod}\ p)$
其中,是勒让德符号,其取值如下:
$ \left ( \frac{a}{p} \right )= \left\{\begin{matrix} &1,\text{a是p的二次剩余} \\ &-1,\text{a是p的二次非剩余} \\ &0,\text{p | a} \end{matrix}\right. $
令,可知是 的一个二次剩余,则必然存在一个正整数 满足
.
(二次剩余定义)
那么对于
整数 共有个(不排除相同的数)
考虑到,故一定存在两组不完全相同的 和 满足
令 , 且
那么:
$s^2+t^2 \equiv s^2+(xs)^2 \equiv s^2(1+x^2) \equiv 0 (\mathrm{mod}\ p_0)$
即
又考虑到u和v的取值范围并且它们不同时为 ,所以
于是 即,获证。
code:
#include<bits/stdc++.h> #define int __int128 #pragma GCC optimize(2) #define n (r-l+1)*(r-l+1) using namespace std; int l,r; inline int reads(){ int x=0,f=1; char ch=getchar(); while(!isdigit(ch)){ if(ch=='-')f=-1; ch=getchar(); } while(isdigit(ch)){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } inline int writes(int x){ if(x<0)putchar('-'),x=-x; if(x>9)writes(x/10); putchar(x%10+48); } inline bool checkprime(int x){ for(int i=2;i<x;i++)if(x%i==0)return x-x+x-x; return x+x-x+x; } inline bool check(int x){ for(register int j=1;j<=x;j++)for(register int k=1;k<=x;k++)if(j*j+k*k==x&&checkprime(x))return x+x-x+x; return x-x+x-x; } inline int solve(){ int ans=0; for(register int i=l;i<=r;i++)ans+=check(i); return ans; } int totalans; signed main(){ l=reads(),r=reads(); for(register int i=1;i<=n;i++)for(register int j=1;j<=n;j++)totalans+=solve(); totalans/=n*n; writes(totalans); return 0; }
- 1
信息
- ID
- 194
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 32
- 已通过
- 3
- 上传者