-
原题链接 https://www.lanqiao.cn/oj-contest/senior-24/
-
标记名字【算法赛】
一条横幅,在1/N,2/N, 3/N···(N-1)/N的地方标记一次,若之前标记过这则不用再标记,求f(N)=此时新标记的个数。
-
上思路
读懂题后,重点在于确定该题的思考方向,也就是,新标记的点分子和分母有什么特点。
于是乎,比如N=6时, 1/6, 2/6, 3/6, 4/6, 5/6中,就明白f(N)=这些分数中不可约分的个数(官方一点,1-N中与N互质的个数)。如4/6=2/3,这条线必然以2/3的形式先出现过。
标准的欧拉函数!
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmax=1e6;
int euler_phi(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;
}void solve(){int n;cin>>n;int m=euler_phi(n);cout<<m<<'\n';
}
signed main()
{int T;T=1;while(T--){solve();}return 0;
}
-
奖杯排列【算法赛】
组委会准备了N 个大小不同的奖杯,每个奖杯上都刻着一个数字 ai,代表奖杯的价值。组委需要从这 N 个奖杯中选出一些奖杯,使得这些奖杯的价值,按照它们在原序列中的顺序排列,能够组成一个长度大于 1、公差为 K 的等差数列。
结果对1e9+7取模。
-
上思路
一个动态规划,只需记录之前以(ai-k)结尾的数列个数。
用map记录,喜欢map。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmmm=2e5+10;
const int mod=1e9+7;signed main()
{int n, k;cin>>n>>k;map<int, int>p1;int ans=0;for(int i=1;i<=n;i++){int t;cin>>t;if(t-k>=1&&p1[t-k]){ans+=p1[t-k];ans%=mod;p1[t]=(p1[t]+p1[t-k])%mod;}p1[t]++;//表示以t作为等差数列的第一个元素,因为长度为1,所以不计入ans中。}cout<<ans%mod<<'\n';return 0;
}
-
估算分数【算法赛】
满足⌊F(N)⌋<F(N)<∣F(N)∣, 则这个N合格。
求N的个数。
-
上思路
- A%(B*N-C)!=0;
- B*N<C
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int xmmm=2e5+10;
int a, b, c;
int mm(int x){//若存在N,使x==c-b*N&&c>b*N, 则return 1, 表示ans需要-1;反之则不需要。if((c-x)%b==0&&c-x>0)return 1;else return 0;
}signed main()
{cin>>a>>b>>c;if(b>=c){cout<<0<<'\n';return 0;}int m=c%b==0?c/b-1:c/b;int ans=m;//初始化ans为mfor(int i=1;i<=sqrt(a);i++){if(a%i==0){ans-=mm(i);if(i*i!=a)ans-=mm(a/i);}}cout<<ans<<'\n';return 0;
}