首先,第一步列出方程式,公母小分别为 a,b,c 。可得以下式子。
{a+b+c=n5a+3b+3c=n
由第一条式子,可以得出 c=n−a−b
代入第二条式子,得到
5a+3b+3n−a−b=n15a+9b+(n−a−b)=3n14a+8b=2n7a+4b=n
然后,由上式得出, b=4n−7a ,由于 b 是整数,所以得出 n−7a≡0(mod4)
这等价于 7a≡n(mod4)
接着, 7≡3(mod4) ,因此上式等同于 3a≡n(mod4)
小知识: 对于非零整数 a,m ,如果存在 b 使得 ab≡1(modm),就称 b 是 a 在模 m 意义下的逆元。摘自Oiwiki中模逆元一章
不难发现,3 在 mod4 下的逆元是 3 (3×3=9,9≡1(mod4))
故 a≡3n(mod4)
这就是优化核心!a 对 4 取模的值是固定的!
最后,设 a0=3nmod4 ,那么所有满足条件的 a 可以表示为 ak=a0+4k ,其中 k∈R
不难看出这是个等差数列,答案即为这个等差数列的项数,这个数列的项数是 ⌊47n−a0⌋+1
附上代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
int cnt=0;
const int r=n%4;
const int a0=((r<<1)+r)%4;
const int maxa=n/7;
if(a0<=maxa){
cnt=((maxa-a0)>>2)+1;
}
cout<<cnt<<"\n";
return 0;
}
有帮助,赞一个