xay loves count

题目的意思是统计(i,j,k)满足a[i]*a[j]=a[k]的数量

思路:数据不大,用数组表示a[n]的大小然后统计个数。满足题目的数量就是3个数量的乘积。

#include<iostream>
using namespace std;
typedef pair<int,int> P;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rep(i,m,n) for(int i=m;i<n;i++)
const int maxn=1e6+7; 
int a[maxn];
signed main(){
	int n;	 
	cin>>n;
    int num;
	rep(i,0,n){
        scanf("%d",&num);
        a[num]++;
	}
	long long ans=0;
  for(int i = 1; i < maxn; i++)
        for(int j = 1; i * j < maxn; j++)
            ans += a[i]*a[j]*a[i*j];
	cout<<ans<<endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您分析这个文法和输入串。 首先,让我们来看一下这个文法的产生式: S → xAy A → ** | * 其中,S 是起始符号,x、y、* 都是终结符号,A 是非终结符号。 接下来,让我们来分析输入串 x*y(记为 α)。 我们可以使用自顶向下的语法分析方法,比如 LL(1) 分析器。 LL(1) 分析器使用一个预测分析表来分析输入串。预测分析表的行表示非终结符号,列表示终结符号,每个表格中的值表示应该使用哪个产生式进行展开。 为了使用 LL(1) 分析器,需要构建文法 G 的预测分析表。预测分析表包含了文法 G 所有的终结符号和非终结符号,以及每个组合的产生式。预测分析表的构建方法可以参考文献 [1]。 在这个文法中,我们可以看到 A 有两个产生式,即 A → ** 和 A → *,这样会导致预测分析表中的冲突。为了解决这个冲突,可以使用 LL(2) 分析器,或者对文法进行修改。 假设我们将文法修改为以下形式: S → xAy A → **B | * B → * | ε 这样,我们就可以构建出 LL(1) 预测分析表。预测分析表如下: | x | * | y | |-------|-------|-------| | S → xAy | | | | | A → * | | | | A → ** | | | | | | 接下来,我们可以使用这个预测分析表对输入串 x*y 进行分析。 分析过程如下: 1. 初始化分析栈,将起始符号 S 压入栈中。 Stack: S$ 2. 读入输入串的第一个字符,即 x。 Input: x*y 3. 从分析栈的栈顶取出一个符号 S。将预测分析表中 S 对应行、x 对应列的值取出。值为 S → xAy,将 Ay 压入栈中,并将 x 从输入串中取出。 Stack: Ay$ 4. 读入输入串的下一个字符,即 *。 Input: *y 5. 从分析栈的栈顶取出一个符号 A。将预测分析表中 A 对应行、* 对应列的值取出。值为 A → *,将 * 从输入串中取出。 Stack: *y$ 6. 读入输入串的下一个字符,即 y。 Input: y 7. 从分析栈的栈顶取出一个符号 *。将它从输入串中取出。 Stack: $ 8. 此时,分析栈为空,输入串也被消耗完毕。分析成功。 因此,我们可以得出结论:输入串 x*y 可以被文法 G(S) 接受。 希望我的回答对您有帮助! 参考文献: [1] Aho, A. V., & Ullman, J. D. (1972). The theory of parsing, translation and compiling (Vol. 1). Prentice-Hall.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值