惨啊。。。谁来挽救窝的智商TAT
题目大意:给一个正三角形的镜子,光线可以从一个顶角射入和射出,给出反射次数,求光路的方案数
考虑光线是一条直线,窝们只是不停的把入射点对称。。。(那啥,表述不清楚请自行脑补。。。
然后找到哪些点满足
发现其实就是求 ∑n−1i=1[gcd(i,n)==1] ,其中 n = N+32 , i % 3 == 2
窝们另
n=3k+1
就是求
∑k−1i=0[gcd(3i+2,3k+1)==1]
又有
gcd(3i+2,3k+1)=gcd(3i−6k,3k+1)=gcd(i−2k,n)
// 这里针对题目给定的数据
所以就相当于是求
∑2ki=k+1[gcd(i,n)==1]
所以就不用窝说了吧~
嗯,,,肯定又做复杂了TAT
【答案】1209002624
#include <iostream>
#include <cstdio>
#define LL long long
using namespace std;
const LL N = 6008819575ll;
const LL k = 2002939858ll;
const LL K = k * 2;
LL ans;
LL mu(LL n)
{
LL ret = 1;
for (int i = 2;i * i <= n;i ++)
if (n % i == 0)
{
if (n / i % i == 0) return 0ll;
n /= i;
ret = -ret;
}
if (n != 1) ret = -ret;
return ret;
}
void cal(LL d)
{
if (d > K) return;
ans += mu(d) * ((K / d) - (k / d));
}
int main()
{
for (LL d = 1;d * d <= N;d ++)
if (N % d == 0)
{
cal(d);
if (d * d != N) cal(N / d);
}
cout << ans << endl;
}