Description
Input Format
第一行一个正整数N,表示要求经过N次反射后经过发射的位置。
Output Format
输出共一行,表示方案数。
Sample Input
3
Sample Output
2
Hint
【数据范围】
对于60%的数据,N<=10^6
对于100%的数据,N<=10^12
- 首先,显然位置任意,从哪个点发射光线,情况相同。
- n次反射,触碰n+1次内壁,第n+1次回到起点。
-反射角范围0<θ<π。
解决方法:
- 画图,模拟简单的数据,n次反射后能回到起点满足什么条件
-在考场上,我先把起点也当做一个发射点,连结相邻两个反射点,反射点在圆上,能不能利用圆的性质呢?
-画出这条弦的圆周角,n次反射,n+1段弦,n+1个圆周角,因为回到原点,所以,n+1个圆周角肯定为2π的倍数。且圆周角即2θ。
欧拉函数求解:
codes
int Euler(int n)
{
int ans=n;
for(int i=2;i*i<=n;i++)
{
if (n % i==0)
{
ans=ans/i*(i-1);
while (n % i==0)n/=i;
}
}
if(n>1)ans=ans/n*(n-1);
return ans;
}
时间n的平方根。
此题codes:
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define INF 0x3f3f3f3f
long long n,ans;
int main(){
scanf("%lld",&n);
n=n+1;
ans=n;
for (long long i=2;i*i<=n;i++)
{
if (n%i==0)
{
ans=ans/i*(i-1);
while (n%i==0) n=n/i;
}
}
if (n>1) ans=ans/n*(n-1);
printf("%lld",ans);
return 0;
}
在考场上,虽然想到了很关键的转换模型,但还是考虑不够全面,不够冷静,没有打出正解。